TimeZoneInfo.ConvertTimeFromUtc不会将旧日期转换为夏令时

时间:2019-05-17 12:39:14

标签: c# .net timezone utc

我正在使用TimeZoneInfo.ConvertTimeFromUtc方法将日期时间转换为目标日期时间。当前其在悉尼的UTC + 10。如果我运行代码,则将其完美转换时间为UTC + 10。但是在一月份却没有夏令时,这是UTC + 11。如果我输入一个Jan日期,请运行代码。它仍将其转换为UTC + 10而不是UTC + 11。

下面是示例代码。

      TimeZoneInfo ESTZone = TimeZoneInfo.FindSystemTimeZoneById("E. Australia Standard Time");
      DateTime date = Convert.ToDateTime("2019-01-23 13:15:23.6090752");
      DateTime SydneyDateTime = TimeZoneInfo.ConvertTimeFromUtc(date, TimeZoneInfo.FindSystemTimeZoneById(Timezone));
      string EST = SydneyDateTime.ToString() + " / " + SydneyDateTime.IsDaylightSavingTime().ToString() + " / " + ESTZone.IsDaylightSavingTime(SydneyDateTime)+" / " + ESTZone.DaylightName + " / " + ESTZone.StandardName;
      DateTime IndiaDateTime = TimeZoneInfo.ConvertTimeFromUtc(date, TimeZoneInfo.FindSystemTimeZoneById("India Standard Time"));


      DateTime date2 = Convert.ToDateTime("2019-05-23 13:15:23.6090752");
      DateTime SydneyDateTime2 = TimeZoneInfo.ConvertTimeFromUtc(date2, TimeZoneInfo.FindSystemTimeZoneById(Timezone));
      string EST2 = SydneyDateTime2.ToString() + " / " + SydneyDateTime2.IsDaylightSavingTime().ToString() + " / " + ESTZone.IsDaylightSavingTime(SydneyDateTime2) + " / " + ESTZone.DaylightName + " / " + ESTZone.StandardName;

输出结果:

EST =“ 23-01-2019 23:15:23 / False / False / E. Australia Summer Time / E. Australia Standard Time”

EST2 =“ 23-05-2019 23:15:23 /错误/错误/ E.澳大利亚夏令时间/ E.澳大利亚标准时间”

在两种情况下,它都会增加10个小时,但在一月份它应该增加11个小时。

我在代码中缺少任何内容吗?

2 个答案:

答案 0 :(得分:4)

您使用的时区错误。 "E. Australia Standard Time"对应于布里斯班时间,该时区不采用夏令时,因此您的冬季和夏季时间以相同的UTC偏移返回。

对于悉尼,您需要使用"AUS Eastern Standard Time"ConvertTimeFromUtc将根据该时区应用UTC偏移量,并为您提供所需的时间。

以下是您的代码段,包括使用适当的时区,并对时区初始化进行了一些编辑,以便进行了编译:

    public void ConvertTimes()
    {
        string Timezone = "AUS Eastern Standard Time";

        TimeZoneInfo ESTZone = TimeZoneInfo.FindSystemTimeZoneById(Timezone);
        DateTime date = Convert.ToDateTime("2019-01-23 13:15:23.6090752");
        DateTime SydneyDateTime = TimeZoneInfo.ConvertTimeFromUtc(date, TimeZoneInfo.FindSystemTimeZoneById(Timezone));
        string EST = SydneyDateTime.ToString() + " / " + SydneyDateTime.IsDaylightSavingTime().ToString() + " / " + ESTZone.IsDaylightSavingTime(SydneyDateTime) + " / " + ESTZone.DaylightName + " / " + ESTZone.StandardName;
        DateTime IndiaDateTime = TimeZoneInfo.ConvertTimeFromUtc(date, TimeZoneInfo.FindSystemTimeZoneById("India Standard Time"));


        DateTime date2 = Convert.ToDateTime("2019-05-23 13:15:23.6090752");
        DateTime SydneyDateTime2 = TimeZoneInfo.ConvertTimeFromUtc(date2, TimeZoneInfo.FindSystemTimeZoneById(Timezone));
        string EST2 = SydneyDateTime2.ToString() + " / " + SydneyDateTime2.IsDaylightSavingTime().ToString() + " / " + ESTZone.IsDaylightSavingTime(SydneyDateTime2) + " / " + ESTZone.DaylightName + " / " + ESTZone.StandardName;
    }

这给出了输出:

  

EST =“ 24/01/2019 00:15:23 / False / True / AUS Eastern Daylight Time / AUS Eastern Standard Time”

     

EST2 =“ 23/05/2019 23:15:23 /对/错/ AUS东部夏令时间/ AUS东部标准时间”

我想这就是您的期望。

顺便说一句,DateTime.IsDaylightSavingTime()使用您的本地时区来确定时间是否在DST内。在这里查看它可能会产生误导。

答案 1 :(得分:2)

.Net似乎不认为AEST是使用夏时制的时区。如果我运行下面的代码,输出表明CEST是夏时制,而AEST不是:

    string timezone1 = "E. Australia Standard Time";
    string timezone2 = "Central European Standard Time";
    TimeZoneInfo info1 = TimeZoneInfo.FindSystemTimeZoneById(timezone1);
    TimeZoneInfo info2 = TimeZoneInfo.FindSystemTimeZoneById(timezone2);
    DateTime date = Convert.ToDateTime("2019-05-23 13:15:23.6090752");
    DateTime datetime1 = TimeZoneInfo.ConvertTimeFromUtc(date, TimeZoneInfo.FindSystemTimeZoneById(timezone1));
    DateTime datetime2 = TimeZoneInfo.ConvertTimeFromUtc(date, TimeZoneInfo.FindSystemTimeZoneById(timezone2));
    var isDaylight1 = info1.IsDaylightSavingTime(datetime1);
    var isDaylight2 = info2.IsDaylightSavingTime(datetime2);
    Console.WriteLine(isDaylight1);
    Console.WriteLine(isDaylight2);

根据www.timeanddate.com,夏令时在该区域是可选的:

  

某些地方在夏季遵守夏令时/夏令时,因此在夏季使用AEDT(澳大利亚东部夏令时)。