首页 文章

大西洋标准时间和大西洋日光时间C#TimeZoneInfo的日期时间转换

提问于
浏览
0

我使用以下方法将utc datetime转换为与其他时区对应的datetime

public string ConvertUTCDateTimetoUserDateTime(string utcDate)
{
    DateTime userDateTime = new DateTime();
    String displaydate = String.Empty;
    try
    {
        destinationTimeZone = TimeZoneInfo.FindSystemTimeZoneById(TIMEZONE_ID);
        DateTime returndt = Convert.ToDateTime(utcDate);
        string strDate = String.Format("{0:" + DATE_FORMAT + " " + "HH:mm}", returndt);
        sourceTimeZone = TimeZoneInfo.Utc;
        string dateFormat = DATE_FORMAT + " " + "HH:mm";
        DateTime unspecified = DateTime.ParseExact(strDate, dateFormat, CultureInfo.InvariantCulture);
        userDateTime = TimeZoneInfo.ConvertTime(unspecified, sourceTimeZone, destinationTimeZone);
        displaydate = userDateTime.ToString(DATE_FORMAT + " HH:mm");
    }
    catch (Exception ex)
    {
    }
    return displaydate;
}

如果我将'03 / 19/2016 18:48'作为UTC日期和时区传递为“大西洋标准时间”(UTC-4:00),那么它将它转换为'03 / 19/2016 15:48'即Atlantic夏令时(UTC-3:00) . 为什么在大西洋标准时间考虑DST?并非所有在大西洋时间的地方都考虑DST . 对于东部标准时间(UTC-5:00)和太平洋标准时间(UTC-8:00),转换在DST时是正确的 . 但是为什么在大西洋时间发生这种情况 . 大西洋日光时间也没有TimeZone ID . 我可以通过检查它是否是AST来增加一小时但是有没有更好的方法来处理AST和ADT?

1 回答

  • 0

    来自the timezone tag wiki

    标识符和名称混乱并随意分配 . 多年来,命名约定各不相同,而且几乎没有一致性 . 通常,不要依赖Windows时区标识符来表示任何特定的内容 . 而是根据其显示名称选择时区 . 举几个例子:“东部标准时间”指的是EST和EDT . ...

    这同样适用于大西洋时间 . "Atlantic Standard Time" 条目的显示名称为 "(UTC-04:00) Atlantic Time (Canada)" ,适用于AST和ADT . 它适用于加拿大的地方,如哈利法克斯,格莱斯湾,鹅湾和蒙克托 . 它也适用于拓乐空军基地(格陵兰岛)和百慕大 .

    在大西洋时间没有DST的地点应该使用 "SA Western Standard Time" 条目 . 它的显示名称为 "(UTC-04:00) Georgetown, La Paz, Manaus, San Juan" ,这确实令人困惑,因为只有圣胡安实际上称之为区域"Atlantic" . 其他人有各种本地名称和缩写 .

    有关更多详细信息,请参阅this page . 如果您有特定的位置,请告诉我,我会相应更新 .

    另外 - 你的代码有点混乱 . 它依赖于字符串格式化和解析方式太多,吞噬异常,并依赖于函数外部的外部变量 . 我建议你清理一下 .

相关问题