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

时间:2016-03-19 20:01:30

标签: c# datetime timezone

我使用以下方法将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'这是大西洋夏令时(UTC-3:00)。为什么在大西洋标准时间考虑DST?并非所有在大西洋时间的地方都考虑DST。对于东部标准时间(UTC-5:00)和太平洋标准时间(UTC-8:00),转换在DST时是正确的。但是为什么在大西洋时间发生这种情况。大西洋日光时间也没有TimeZone ID。我可以通过检查它是否是AST来增加一小时,但有没有更好的方法来处理AST和ADT?

1 个答案:

答案 0 :(得分: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",这确实令人困惑,因为只有圣胡安实际上称这个区域为#34; Atlantic"。其他人有各种本地名称和缩写。

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

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