【发布时间】:2011-02-10 17:09:41
【问题描述】:
.NET DateTime.ToLocalTime 方法的文档指出:
在 Windows XP 系统上,ToLocalTime 方法只识别当前 转换时的调整规则 UTC 到本地时间。因此, 转换之前的时期 现行调整规则出台 效果可能无法准确反映 UTC 与本地时间之间的差异。
我在 Windows 7 上进行开发,但部署到混合环境。如何提供与 Windows 7 的 ToLocalTime 行为相匹配的一致、正确的实现?
编辑
我进行了测试:
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 日期 ConvertTimeFromUtc:2010 年 7 月 1 日凌晨 3:00:00 预计时间:2010 年 7 月 1 日凌晨 3 点 非 DST 日期 ToLocalTime: 12/1/2010 2:00:00 AM 非 DST 日期 ConvertTimeFromUtc:12/1/2010 2:00:00 AM 预计:2010 年 12 月 1 日凌晨 2 点 日期 ToLocalTime 种类:本地 Date ConvertTimeFromUtc 种类:本地
文档有错吗?我可以简单地调用 ToLocalTime 吗?
编辑 2
我们在一个实际的 XP 系统(不是虚拟机)上运行它,并且在那里也得到了相同的结果。我的测试用例正确吗?谁能提供一个结果会不同的案例?
【问题讨论】:
标签: .net datetime windows-xp timezone utc