Как преобразовать дату и время в определенный часовой пояс в С#? - программирование
Подтвердить что ты не робот

Как преобразовать дату и время в определенный часовой пояс в С#?

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

gmTime= 03/02/2013 1:00:00 AM

 TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
 var time = timeZoneInfo.ConvertTime(gmTime, timeZone);

Когда я отлаживаю значение time, которое должно быть 03/01/2013 8:00:00 PM при применении зоны, оно возвращается как 03/02/2013 1:00:00 AM.

Если я сделаю time.ToLocalTime(), тогда я получу правильное значение. Однако мне нужно преобразовать time в разные часовые пояса.

4b9b3361

Ответ 1

Объекты DateTime имеют переменную "Вид", которая помогает TimeZoneInfo знать, как ее обрабатывать. В документации MSDN для TimeZone.ConvertTime оно имеет следующее:

DateTimeKind.Local, Преобразует локальное время в timeTimeZone.

DateTimeKind.Utc, конвертирует скоординированное универсальное время (UTC) в timeTimeZone.

DateTimeKind.Unspecified, Предполагается, что он локальный.

Например:

  Console.WriteLine("Local time zone is '{0}'.", TimeZoneInfo.Local.Id);

  var gmTime          = new DateTime(2013, 03, 02, 01, 00, 00, DateTimeKind.Utc);
  var localTime       = new DateTime(2013, 03, 02, 01, 00, 00, DateTimeKind.Local);
  var unspecifiedTime = new DateTime(2013, 03, 02, 01, 00, 00);

  var timeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");

  var gmTimeConverted           = TimeZoneInfo.ConvertTime(gmTime,          timeZone); // 03/02/2013 8:00:00AM
  var localTimeConverted        = TimeZoneInfo.ConvertTime(localTime,       timeZone); // 03/02/2013 
  var unspecifiedTimeConverted  = TimeZoneInfo.ConvertTime(unspecifiedTime, timeZone);

  Console.WriteLine("Converting GMT         to EST: {0}", gmTimeConverted);
  Console.WriteLine("Converting Local       to EST: {0}", localTimeConverted);
  Console.WriteLine("Converting Unspecified to EST: {0}", unspecifiedTimeConverted);

Результаты в:

Local time zone is 'Pacific Standard Time'.
Converting GMT         to EST: 3/1/2013 8:00:00 PM
Converting Local       to EST: 3/2/2013 4:00:00 AM
Converting Unspecified to EST: 3/2/2013 4:00:00 AM

Или, если ваш локальный часовой пояс - "Восточное стандартное время", вы получаете эти результаты

Local time zone is 'Eastern Standard Time'.
Converting GMT         to EST: 3/1/2013 8:00:00 PM
Converting Local       to EST: 3/2/2013 1:00:00 AM
Converting Unspecified to EST: 3/2/2013 1:00:00 AM



Если вы хотите, чтобы TimeZoneInfo рассматривал "Unspecified" как Utc, вы должны функционировать как TimeZoneInfo.ConvertTimeFromUtc. Опять из документации MSDN

DateTimeKind.Local, выдает исключение ArgumentException.

DateTimeKind.Unspecified или DateTimeKind.Utc, преобразует из скоординированного универсального времени (UTC).

Ответ 2

Попробуйте что-то вроде следующего Chace

TimeZoneInfo estTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime estDateTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, estTimeZone);