timezoneinfo.converttime fromutc不会将旧日期转换为日光保存时间



我正在使用timezoneinfo.converttime fromutc方法将日期时间转换为目标日期时间。目前在悉尼的UTC 10。如果我运行代码,则将其完美地转换为UTC 10。但是在1月,除昼夜节省时,它是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.澳大利亚夏季时间/E.澳大利亚标准时间"

est2 =" 23-05-2019 23:15:23/false/false/false/E.澳大利亚夏季时间/E.澳大利亚标准时间"

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

我缺少代码中的任何内容。

您正在使用错误的时区。"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/true/aus东部日光时间/aus东部标准时间"

est2 =; 23/05/2019 23:15:23/true/false/aus东部日光时间/aus东部标准时间"

我认为这是您所期望的。

顺便说一句,dateTime.isdaylightsavingtime((使用您的本地时区来确定时间是否在dst之内。在这里看它可能会误导它。

似乎.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(澳大利亚东部日光时间(。

相关内容

  • 没有找到相关文章

最新更新