2011-03-09 7 views
4

Мне нужно преобразовать время в «UTC + 03: 30 часовой пояс» в моем веб-приложение здесь дата UTC:Как я могу преобразовать дату UTC в свой часовой пояс?

DateTime dt = DateTime.UtcNow; 

Есть ли функция для преобразования UTC мой часовой пояс или нет? Я не хочу привлекать себя к написанию новой функции в моем приложении, если в ASP.NET есть функция.

Приложение может быть размещено на разных серверах в мире, и именно поэтому я использовал дату UTC.

Мне нужна функция для добавления 3:30 к текущему времени UTC.

+0

что вы будете делать, когда dayli ght экономит время? – Axarydax

+0

Я понятия не имею, что я смутился о дневном спасении, есть ли идеи? – kamiar3001

+0

Мы не знаем, почему вы пытаетесь использовать этот часовой пояс, поэтому трудно сказать. Что особенного в UTC + 3: 30? –

ответ

7

Вы точно знаете, что ваш часовой пояс: действительно UTC +3: 30, все время, без летнего времени? Если это так, вы можете создать DateTimeOffset с соответствующим смещением (3,5 часа). Например:

DateTimeOffset dtOffset = new DateTimeOffset(DateTime.UtcNow, 
              TimeSpan.FromHours(3.5)); 

Конечно, это дает вам DateTimeOffset вместо DateTime ... Вы можете использовать это?

Лучшим решением является использование TimeZoneInfo - например, вы можете получить правильный часовой пояс и вызвать

DateTime local = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, tzInfo); 

... или вы могли бы использовать TimeZoneInfo, но все-таки получить DateTimeOffset:

DateTimeOffset dto = TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow, tzInfo); 

Лично я бы порекомендовал вас использовать DateTimeOffset, если вы можете, так как значение DateTime несколько неоднозначно и трудно работать с правильно.

. Сроки и время в .NET - это немного беспорядок, к сожалению :(У меня есть проект под названием Noda Time, который должен улучшить состояние дел, если мы когда-либо закончим его, но он далек от готовности к производству на данный момент.

+0

Если требуется DateTime, вы всегда можете снова вызвать 'dtoffset.DateTime' :) Проблема с DateTimeOffset заключается в том, что вне 'System.ServiceModel.Syndication', никакая другая часть BCL, похоже, не использует его (подобно тому, как почти ничего никогда не использует' System.Uri' и вместо этого обычно ожидает строки.) –

+0

@Michael: True, но я надеюсь, что это все равно только на границе экрана, и в этом случае его действительно нужно отформатировать. К сожалению, на данный момент мы не располагаем достаточной информацией :( –

-1

это позволит вам конвертировать UTC в любой часовой пояс

Shared Function FromUTC(ByVal d As Date, ByVal tz As String) As Date 
Return (TimeZoneInfo.ConvertTimeBySystemTimeZoneId(d, TimeZoneInfo.Utc.Id, tz)) 
end function 

вы в состоянии получить список часовых поясов с помощью

For Each timeZone As TimeZoneInfo In tzCollection 
    Console.WriteLine(" {0}: {1}", timeZone.Id, timeZone.DisplayName) 
Next 
+0

На самом деле это не C# -дружественно использовать тип даты VB, не так ли? Кроме того, я не считаю, что часовой пояс * system * OP хочет использовать. –

Смежные вопросы