【问题标题】:Converting time from different timezone with daylight savings included转换不同时区的时间,包括夏令时
【发布时间】:2013-03-28 17:19:03
【问题描述】:

我的进程接受带有时区的日期时间值作为字符串(数据来自外部系统)。我需要将此日期时间转换为本地机器时区的时间。

示例代码:

string cetId = "Central European Standard Time";
if (timeZone == "CET")
{
    TimeZoneInfo cetZone = TimeZoneInfo.FindSystemTimeZoneById(cetId);
    returnDateTime = TimeZoneInfo.ConvertTime(statusDateTime, cetZone, TimeZoneInfo.Local);
}
else if (timeZone == "CEST")
{
    TimeZoneInfo cestZone = TimeZoneInfo.FindSystemTimeZoneById(cetId);
    returnDateTime = TimeZoneInfo.ConvertTime(statusDateTime, cestZone, TimeZoneInfo.Local);
}

如果时间是 CEST(中欧夏令时间)而不是 CET(中欧时间)或者 .net TimeZoneInfo 对象是否处理这种情况,我是否需要做任何具体的事情?

【问题讨论】:

    标签: c# .net datetime


    【解决方案1】:

    你应该没事的。

    您正在告诉 ConvertTime 两个时区(源和目标)是什么。

    您对此有具体问题还是只是要求确认?

    【讨论】:

    • 我只是担心夏令时会根据时区在不同的日期生效,我担心时间不能正确转换
    【解决方案2】:

    来自TimeZoneInfo.ConvertTime()

    The value of the Kind property of the dateTime parameter must correspond to the sourceTimeZone parameter, as the following table shows.
    

    只想补充一点,您需要注意 StatusDateTime 的“Kind”属性。在您的情况下,它必须是“未指定”。查看“备注”部分

    【讨论】:

      【解决方案3】:

      不久前我创建了一个库来封装这些类型的转换:

      https://github.com/b9chris/TimeZoneInfoLib.Net/blob/master/TimeZoneInfoLib/TimeZone/UtcTimeZone.cs

      可能对您有用,或者您可能只想选择它来仔细检查您的代码。它封装的其中一件事是@Brian 的警告-因此它具有与 .Kind 属性相关的显式方法名称,如果 .Kind 错误,则会引发有用的异常。获得有用的/常见的/日光时间名称和缩写也需要一些繁重的工作:

      https://github.com/b9chris/TimeZoneInfoLib.Net/blob/master/TimeZoneInfoLib/TimeZone/TimeZoneShortNameMap.cs

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-12
        • 2012-10-31
        • 2018-04-30
        • 2012-04-07
        • 2018-05-19
        • 2019-12-15
        • 1970-01-01
        相关资源
        最近更新 更多