TimeZoneInfo.ConvertTimeFromUtc 未将旧日期转换为当时的夏令时

TimeZoneInfo.ConvertTimeFromUtc is not converting old dates to then daylight saving time

我正在使用 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 / 东澳大利亚夏令时间/东澳大利亚标准时间"

EST2="23-05-2019 23:15:23/False/False/E.澳大利亚夏令时/E.澳大利亚标准时间"

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

我是否遗漏了代码中的任何内容。

.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,夏令时在这个地区是可选的:

Some places observe daylight saving time/summer time during the summer, and therefore use AEDT (Australian Eastern Daylight Time) in the summer.

您使用了错误的时区。 "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 / True / False / AUS Eastern Daylight Time / AUS Eastern Standard Time"

我认为这正是您所期待的。

顺便说一下,DateTime.IsDaylightSavingTime() 使用您当地 时区来确定时间是否在夏令时。在这里看可能会产生误导。