ConvertTimeFromUtc() 和 ToUniversalTime() 是不是处理 DST?

Posted

技术标签:

【中文标题】ConvertTimeFromUtc() 和 ToUniversalTime() 是不是处理 DST?【英文标题】:Does ConvertTimeFromUtc() and ToUniversalTime() handle DST?ConvertTimeFromUtc() 和 ToUniversalTime() 是否处理 DST? 【发布时间】:2014-06-03 04:38:04 【问题描述】:

如果夏令时生效,并且日期对象已保存到数据库(UTC 格式)中,您检索该数据库以在视图中显示它(例如 asp.net-mvc 中的视图)。

您可以使用以下方法做到这一点:

public static DateTime ConvertToLocalTimeFromUtcTime(DateTime utcDate, string timeZoneId)

    TimeZoneInfo localZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
    DateTime localTime = TimeZoneInfo.ConvertTimeFromUtc(utcDate, localZone);

    if (localZone.IsDaylightSavingTime(localTime)) 
        localTime = localTime.AddHours(1); // is this needed !?

    return localTime;

问题是,TimeZoneInfo.ConvertTimeFromUtc() 是否处理 DST,或者您是否必须自己检查并在日期对象中添加或减去 X 小时?

通过使用ToUniversalTime() 将日期对象转换为 UTC 格式将日期对象持久保存到数据库时的相同问题。

【问题讨论】:

您的时区现在可能正在使用 DST,这将使您的测试变得非常容易;) 是的。 DST 是否在特定地区生效是当地的政治决定。在 Web 服务器上,您对它的了解还不够多。总是在浏览器中进行转换,它知道。 @AndrewMorton,是的,我确实看到从客户提供的时间中减去了 2 小时。但反过来又如何呢?您是说我不必在服务器端转换用户所在区域的时间吗? 也许这会有用:Convert UTC date time to local date time using javascript. @HansPassant - 在浏览器中转换不一定是最好的主意。这是一种方法,但it suffers from errors。如果您有时区 id(在这种情况下是 OP),那么 TimeZoneInfo 将比 JavaScript 更准确。此外,在很多情况下,您可能希望转换为不同时区,而不仅仅是浏览器的本地时区。 【参考方案1】:

是的。只要您定位的时区使用夏令时,ConvertTimeFromUtc 就会自动处理夏令时调整。

来自the MSDN documentation:

在执行转换时,ConvertTimeFromUtc 方法会应用在destinationTimeZone 时区有效的任何调整规则。

您应该尝试在您的转换中增加一个小时。这会给你一个不正确的翻译。

关于DateTime.ToUniversalTime,它确实考虑了夏令时,但要小心这种方法。它假定输入值在计算机的本地时区。如果您只需要使用DateTimeKind.Utc 标记它,请改用DateTime.SpecifyKind

【讨论】:

以上是关于ConvertTimeFromUtc() 和 ToUniversalTime() 是不是处理 DST?的主要内容,如果未能解决你的问题,请参考以下文章

belong to 和belongs to的区别

php.net 手册中的 mail():“to”和“to-header”之间的区别

add up to和add to,add…up ,add…to区别

adjust to和adapt to有啥区别

Django - render()、render_to_response() 和 direct_to_template() 有啥区别?

Oracle中的日期处理函数TO_DATE 和 TO_CHAR