2011-02-10 2 views
5

Документация для метода состояний .NET DateTime.ToLocalTime:DateTime.ToLocalTime на Windows XP

В системах Windows XP, то ToLocalTime метод распознает только текущий регулировка правила при переходе от UTC к местному времени. В результате конверсии за периоды, предшествующие правилу корректировки тока , пришли к . Эффект может неточно отражать разницу между временем по Гринвичу и местным временем.

Я развиваюсь в Windows 7, но развертываясь в смешанной среде. Как я могу обеспечить последовательную, правильную реализацию, которая соответствует поведению Windows 7 в ToLocalTime?

EDIT

Я побежал тест:

static void Main() 
{ 
    // 8 AM in July, UTC. That would have been DST, so 3 AM CDT. 
    var dstDate = new DateTime(2010, 7, 1, 8, 0, 0, DateTimeKind.Utc); 

    // 8 AM in December, UTC. Not DST, so 2 AM CST. 
    var nonDstDate = new DateTime(2010, 12, 1, 8, 0, 0, DateTimeKind.Utc); 

    Log("DST Date ToLocalTime: " + dstDate.ToLocalTime()); 
    Log("DST Date ConvertTimeFromUtc: " + ConvertTimeFromUtc(dstDate)); 
    Log("Expected: 3 AM July 1 2010"); 

    Log(string.Empty); 

    Log("Non-DST Date ToLocalTime: " + nonDstDate.ToLocalTime()); 
    Log("Non-DST Date ConvertTimeFromUtc: " + ConvertTimeFromUtc(nonDstDate)); 
    Log("Expected: 2 AM December 1 2010"); 

    Log(string.Empty); 

    Log("Date ToLocalTime Kind: " + dstDate.ToLocalTime().Kind); 
    Log("Date ConvertTimeFromUtc Kind: " + ConvertTimeFromUtc(dstDate).Kind); 
} 

private static void Log(string message) 
{ 
    Console.WriteLine(message); 
} 

private static DateTime ConvertTimeFromUtc(DateTime utcDateTime) 
{ 
    return 
     DateTime.SpecifyKind(
      TimeZoneInfo.ConvertTimeFromUtc(
       utcDateTime, 
       TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id)), 
      DateTimeKind.Local); 
} 

Результаты были идентичны под XP Pro 32-битным, SP3 (как VM) и ОС Windows 7 Enterprise 64-разрядное:

DST Date ToLocalTime: 7/1/2010 3:00:00 AM 
DST Date ConvertTimeFromUtc: 7/1/2010 3:00:00 AM 
Expected: 3 AM July 1 2010 

Non-DST Date ToLocalTime: 12/1/2010 2:00:00 AM 
Non-DST Date ConvertTimeFromUtc: 12/1/2010 2:00:00 AM 
Expected: 2 AM December 1 2010 

Date ToLocalTime Kind: Local 
Date ConvertTimeFromUtc Kind: Local

Неправильная ли документация? Можно ли просто вызвать ToLocalTime?

EDIT 2

Мы провели это на фактической XP системы (не VM) и получили одинаковые результаты там. Правильны ли мои тестовые примеры? Может ли кто-нибудь указать случай, когда результаты будут отличаться?

ответ

5

В системах Windows XP, метод ToLocalTime распознает только текущий настройки правила при переходе от UTC к местному времени. В результате конверсии за периоды, предшествующие правилу корректировки тока , пришли к . Эффект может неточно отражать разницу между временем по Гринвичу и местным временем.

США изменили правила настройки для летнего времени в 2007 году

  • 2006: Старт первого воскресенья в апреле, End в последнее воскресенье октября.
  • 2007: Начало 2-го воскресенья марта, конец 1-го воскресенья ноября.

Ошибка в том, что они следуют правилам 2007 года для всех дат, а не только по датам после 2007 года. Правила DST не изменились за 20 лет, Windows XP просто не имеет концепции разных правил для разных лет. Он рассмотрит 31 октября 2006 года, когда будет на летнее время, когда на самом деле это не так.

Если вы имеете дело только с датами после 2007 года, тогда вы добры, не нужно ничего делать особо. Если вы имеете дело с датами до или до 2006 года, вам нужно будет проверить год и применить смещение DST вручную.

+0

Aargh! Я думал, они имели в виду «должен ли я применять корректировку DST RIGHT NOW», когда они говорили о правилах настройки. Я просто нашел это [ссылка] (http://www.techrepublic.com/article/what-net-developers-need-to-know-about-daylight-saving-time-changes/6160501), в котором говорится, что вы правы , Благодаря! – TrueWill

1

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

+0

+1 для указания меня в правильном направлении, но это только половина ответа. Я нашел заметки WinXP в [link] (http://msdn.microsoft.com/en-us/library/system.timezoneinfo.local.aspx). Может быть, 'TimeZoneInfo.ConvertTimeFromUtc (utcDate, TimeZoneInfo.FindSystemTimeZoneById (TimeZoneInfo.Local.Id))'? – TrueWill