В документации к методу .NET DateTime.ToLocalTime говорится:
В системах Windows XP ToLocalTime метод распознает только текущие правило настройки при конвертации из UTC по местному времени. Как результат, конверсии за периоды до действующее правило корректировки вступило в эффект может не точно отражать разница между UTC и местным временем.
Я разрабатываю на Windows 7, но развертываю в смешанной среде. Как я могу обеспечить последовательную и правильную реализацию, которая соответствует поведению ToLocalTime в Windows 7?
РЕДАКТИРОВАТЬ
Я провел тест:
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);
}
Результаты были идентичными в 32-разрядной версии XP Pro, SP3 (как ВМ) и 64-разрядная версия Windows 7 Enterprise:
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?
РЕДАКТИРОВАТЬ 2
Мы запустили это на реальной системе XP (не на виртуальной машине) и получили там идентичные результаты. Верны ли мои тестовые примеры? Может ли кто-нибудь представить случай, когда результаты будут отличаться?