【问题标题】:DateTime.ToLocalTime on Windows XPWindows XP 上的 DateTime.ToLocalTime
【发布时间】: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


    【解决方案1】:

    在 Windows XP 系统上,ToLocalTime 方法只识别当前 转换时的调整规则 UTC 到本地时间。因此, 转换之前的时期 现行调整规则出台 效果可能无法准确反映 UTC 与本地时间之间的差异。

    美国在2007年改变了夏令时的调整规则。

    • 2006:从 4 月的第一个星期日开始,在 10 月的最后一个星期日结束。
    • 2007:3 月的第 2 个星期日开始,11 月的第 1 个星期日结束。

    错误是他们在所有日期都遵循 2007 年的规则,而不仅仅是 2007 年之后的日期。DST 规则在 20 年内没有改变,Windows XP 只是没有不同年份不同规则的概念.它会将 2006 年 10 月 31 日视为夏令时,而实际上并非如此。

    如果您只处理 2007 年之后的日期,那么您很好,不需要做任何特别的事情。如果您处理的是 2006 年或之前的日期,那么您需要检查年份,并手动应用 DST 偏移量。

    【讨论】:

    • 啊!当他们谈论调整规则时,我认为他们的意思是“我应该立即应用 DST 调整”。我刚刚发现这个link 说你是对的。谢谢!
    【解决方案2】:

    您可以使用 System.TimeZoneInfo.ConvertTime(DateTime, TimeZoneInfo, TimeZoneInfo) 方法将时间从源的时区转换为用户的本地时区。

    【讨论】:

    • +1 为我指明了正确的方向,但这只是答案的一半。我在link 找到了 WinXP 笔记。也许TimeZoneInfo.ConvertTimeFromUtc(utcDate, TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多