2016-11-18 6 views
-1

Мое приложение получает объект DateTime в формате UTC и ему нужно вывести его как строку в формате EST. Я пробовал следующий код, но когда я получаю выведите смещение все еще показывает как +00: 00 вместо -05: 00Преобразование UTC DateTime в EST DateTime с правильным смещением

static void Main(string[] args) 
    { 
     var currentDate = DateTime.Now.ToUniversalTime(); 
     var convertedTime = ConvertUtcToEasternStandard(currentDate); 

     Console.WriteLine(currentDate.ToString("yyyy-MM-ddTHH:mm:sszzz")); 
     Console.WriteLine(convertedTime.ToString("yyyy-MM-ddTHH:mm:sszzz")); 
    } 

private static DateTime ConvertUtcToEasternStandard(DateTime dateTime) 
    { 
     var easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
     return TimeZoneInfo.ConvertTimeFromUtc(dateTime, easternZone); 
    } 

Воспроизводит:

2016-11-18T06:56:14+00:00 
2016-11-18T01:56:14+00:00 

Таким образом, время является правильно сдвинувшись, но смещение остается на +00: 00, когда я хочу, чтобы оно было -05: 00. Любая идея, как я могу получить объект DateTime с правильным смещением при выводе с указанной выше строкой формата?

+0

вы в времени UTC, случайно? –

+0

Да, Великобритания, так что в настоящее время в UTC – Ruddles

+0

Это ваша проблема. Добавлен ответ. –

ответ

1

Недавно я прочитал это в API, в основном, с DateTime значениями, очень невозможно получить смещение формата zzz, чтобы быть чем-то полезным.

С значениями DateTime спецификатор пользовательского формата «zzz» представляет собой подписанное смещение часового пояса локальной операционной системы с UTC, измеренное в часах и минутах. Он не отражает значение свойства DateTime.Kind экземпляра. По этой причине спецификатор формата «zzz» не рекомендуется использовать с значениями DateTime.

С значениями DateTimeOffset этот спецификатор формата представляет смещение значения DateTimeOffset от UTC в часах и минутах.

Смещение всегда отображается с ведущим знаком. Знак «плюс» (+) обозначает часы перед UTC, а знак «минус» (-) обозначает часы позади UTC. Одноразрядное смещение форматируется с начальным нулем.


К примеру, я в восточном поясное время, и это мой результат:

2016-11-18T07:9:38-05:00 
2016-11-18T02:9:38-05:00 

Очевидно время UTC не должно быть смещением -05:00.


изменить код только немного, и у нас есть решение:

void Main() 
{ 
    var currentDate = DateTimeOffset.Now.ToUniversalTime(); 
    var convertedTime = ConvertUtcToEasternStandard(currentDate); 

    var format = "yyyy-MM-ddTHH:m:sszzz"; 
    Console.WriteLine(currentDate.ToString(format)); 
    Console.WriteLine(convertedTime.ToString(format)); 
} 

// Define other methods and classes here 
private static DateTimeOffset ConvertUtcToEasternStandard(DateTimeOffset dateTime) 
{ 
    var easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
    return TimeZoneInfo.ConvertTime(dateTime, easternZone); 
} 

Результат:

2016-11-18T07:17:46+00:00 
2016-11-18T02:17:46-05:00 

Это больше походит на это.

Примечание: заменил предыдущий код, незнание получило лучшее из меня, и я не понял, что он не работает правильно. TimeZoneInfo.ConvertTime принимает DateTimeOffset, который делает то, что мы хотим.

И если мы добавим еще один случай для Pacific Standard Time:

private static DateTimeOffset ConvertUtcToPacificStandard(DateTimeOffset dateTime) 
{ 
    var pacificZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); 
    return TimeZoneInfo.ConvertTime(dateTime, pacificZone); 
} 

Мы получаем правильный результат:

2016-11-17T23:21:21-08:00 
+0

Это здорово, заставило его работать в моем приложении с этим ответом. Спасибо за помощь :) – Ruddles

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