.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);
}
结果在XP Pro 32位,SP3(作为VM)和Windows 7 Enterprise 64位下完全相同:
DST日期ToLocalTime: 7/1/2010 3:00:00 AM DST日期ConvertTimeFromUtc: 7/1/2010 3:00:00 AM 预期: 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类型: 本地 日期ConvertTimeFromUtc类型: 本地
文档有误吗?我可以直接调用ToLocalTime吗?
编辑2
我们在实际的XP系统上运行了这个程序(而不是虚拟机),并得到了完全相同的结果。我的测试用例正确吗?有人能提供一个结果不同的案例吗?