Мне регулярно приходится работать с преобразованием значения 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 и просто изменить зону для экранов клиентов. Проект слишком большой и обширный, чтобы сделать это изменение сейчас. Там много статей, в которых рассказывается о других проблемах обработки часовых поясов, но просто не в этом конкретном сценарии.
Есть ли лучший способ сделать это?
Приведенный выше код не будет компилироваться. Что вы имели в виду под 'DateTimeOffset ret = ret.ToOffset (tzObject.GetUtcOffset (value));'? –
Перейдите в https://dotnetfiddle.net/LLl1Za и посмотрите строки 42 и 43. вы точно увидите, как это работает. У меня нет этой функции, но у меня она работает. – Brian
https://msdn.microsoft.com/en-us/library/bb396765%28v=vs.110%29.aspx –