2015-04-03 5 views
0

Мне регулярно приходится работать с преобразованием значения DateTimeOffset в другой часовой пояс также в DateTimeOffset. большой головной болью является тот факт, что метод преобразования класса TimeZoneInfo возвращает DateTime, поэтому мне приходится снова преобразовывать данные, когда я это в тип DateTimeOffset.Преобразование даты из одного часового пояса в другой, когда оба типа даты DateTimeOffset

Чтобы по прибывшему это, я кулачок с метода расширения для DateTimeOffset:

Это должно существовать в классе.

public static DateTimeOffset ToNewTimeZone(this DateTimeOffset value, string timeZone) 
{ 
    value = value.UtcDateTime; 
    TimeZoneInfo tzObject = TimeZoneInfo.FindSystemTimeZoneById(timeZone); 
    //Using the GetUtcOffset means that the TimeZoneInfo class is responsible for calculating the Daylight savings time. 
    DateTimeOffset ret = value.ToOffset(tzObject.GetUtcOffset(value)); 
    return ret; 
} 

Это очень хорошо работает при каждом тесте я пришел с, но мне кажется, безвкусный мне. Обычно это признак того, что уже есть лучшее решение. Однако я еще не нашел его.

Я создаю .NET-скрипт, чтобы показать свою работу. https://dotnetfiddle.net/LLl1Za

Линии 42 и 43 выделяют этот код в свете моих других экспериментов над ним.

Просто так, что у нас есть контекст, я не могу изменить БД для хранения данных только в формате UTC и просто изменить зону для экранов клиентов. Проект слишком большой и обширный, чтобы сделать это изменение сейчас. Там много статей, в которых рассказывается о других проблемах обработки часовых поясов, но просто не в этом конкретном сценарии.

Есть ли лучший способ сделать это?

+0

Приведенный выше код не будет компилироваться. Что вы имели в виду под 'DateTimeOffset ret = ret.ToOffset (tzObject.GetUtcOffset (value));'? –

+0

Перейдите в https://dotnetfiddle.net/LLl1Za и посмотрите строки 42 и 43. вы точно увидите, как это работает. У меня нет этой функции, но у меня она работает. – Brian

+1

https://msdn.microsoft.com/en-us/library/bb396765%28v=vs.110%29.aspx –

ответ

2

Я не вижу причины, по которой вы должны реализовать это самостоятельно. Вы должны использовать TimeZoneInfo.ConvertTime(), чтобы изменить часовой пояс DateTimeOffset.

Пожалуйста, обратитесь к https://msdn.microsoft.com/en-us/library/bb396765%28v=vs.110%29.aspx

+0

Я сделал это сам, потому что независимо от того, сколько раз я Googled или Binged ответ, на верхних 3 страницах было все, кроме этого. И VS не показывал мне еще 2 переопределения для конвертирования, просто DateTime. Рад, что я спросил. – Brian

+1

Я только что разобрался в Google: https://www.google.com.au/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=datetimeoffset%20change%20timezone –