首页 > 解决方案 > TimeZoneInfo.ConvertTimeFromUtc 没有将旧日期转换为夏令时

问题描述

我正在使用 TimeZoneInfo.ConvertTimeFromUtc 方法将日期时间转换为目标日期时间。当前在悉尼的 UTC+10。如果我运行代码,它将完美地将时间转换为 UTC+10。但是在没有夏令时的一月是UTC + 11。如果我输入一月日期运行代码。它仍然将其转换为 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 / False / False / E. Australia Summer Time / E. Australia Standard Time"

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

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

标签: c#.nettimezoneutc

解决方案


您使用了错误的时区。 "E. Australia Standard Time"对应于布里斯班时间,并且该时区不遵守 DST,因此您的冬季和夏季时间以相同的 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 / 澳大利亚东部夏令时间 / 澳大利亚东部标准时间"

EST2 = "23/05/2019 23:15:23 / True / False / AUS Eastern Daylight Time / AUS Eastern Standard Time"

我认为这是您所期望的。

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


推荐阅读