.NET TimeZone.CurrentTimeZone.GetDaylightChanges返回错误的DST 2005 [英] .NET TimeZone.CurrentTimeZone.GetDaylightChanges returns wrong DST for 2005

查看:63
本文介绍了.NET TimeZone.CurrentTimeZone.GetDaylightChanges返回错误的DST 2005的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用以下代码显示了2005年到2035年之间的夏令时。

I used the following code to display the Daylight Saving Time for the years between 2005 and 2035.

对于2005年,此页面显示DST在4月3日至10月30日之间。但是GetDaylightChanges会在3月13日和11月6日返回。

For the year 2005, this page shows the DST is between April 3rd and October 30th. But the GetDaylightChanges returns March 13 and November 6th.

.NET GetDaylightChanges是可靠的函数吗?

Is the .NET GetDaylightChanges a reliable function?

< img src = https://i.stack.imgur.com/0iSDm.png alt =在此处输入图片描述>

    public static void GetCurrentTimeZone()
    {
        for (int i = 0; i < 30; i++)
        {
            var dlt = TimeZone.CurrentTimeZone.GetDaylightChanges(2005 + i);

            Console.WriteLine(2005 + i);
            Console.WriteLine(dlt.Start.ToLongDateString());
            Console.WriteLine(dlt.End.ToLongDateString());

            Console.WriteLine(" ");
        }
    }


推荐答案

从1987-2006年,规则为:DST从4月的第一个星期日到10月的最后一个星期日生效。

From 1987-2006, the rule was: DST is in effect from the first Sunday in April through the last Sunday in October.

从2007年至今,规则为:DST有效期从三月的第二个星期日到十一月的第一个星期日。

From 2007-present, the rule was: DST is in effect from the second Sunday in March through the first Sunday in November.

但是,正如@MaheshKava指出的那样, GetDaylightChanges API表示:

However, as pointed out by @MaheshKava, the remarks section of the GetDaylightChanges API says this:


由于TimeZone类仅支持一个夏令时
调整规则,因此应用GetDaylightChanges方法当前的
调整规则适用于任何年份,无论调整规则
是否实际适用于该年份。

Because the TimeZone class supports only one daylight saving time adjustment rule, the GetDaylightChanges method applies the current adjustment rule to any year, regardless of whether the adjustment rule actually applies to that year.

这意味着当前规则(从3月的第二个星期日到11月的第一个星期日)将在所有年份中应用,无论该规则是否实际生效在那一年。因此,总而言之, GetDaylightChanges 将为您提供2007年之前任何一年的不准确结果,这显然是设计使然。

This means that the current rule (2nd Sunday in March through the 1st Sunday in November) is being applied for all years regardless of whether this rule was actually in effect during that year. So, to summarize, GetDaylightChanges will give you inaccurate results for any year prior to 2007, and apparently this is by design.

API文档进一步说,您可以使用 TimeZoneInfo.GetAdjustmentRules 获取更准确的信息。我对此很好奇,所以我写了这段代码:

The API documentation goes on further to say that you can use TimeZoneInfo.GetAdjustmentRules to get more accurate information. I was curious about this, so I wrote this code:

    static void Main(string[] args)
    {
        PrintAllDaylightSavingsAdjustmentDates();
        Console.ReadLine();
    }

    public static void PrintAllDaylightSavingsAdjustmentDates()
    {
        TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
        TimeZoneInfo.AdjustmentRule[] adjustmentRules = timeZoneInfo.GetAdjustmentRules();

        for (int year = 2000; year < 2030; year++)
        {
            PrintDaylightSavingsAdjustmentDatesForYear(adjustmentRules, year);
        }
    }

    public static void PrintDaylightSavingsAdjustmentDatesForYear
        (
        TimeZoneInfo.AdjustmentRule[] adjustmentRules, 
        int year
        )
    {
        DateTime firstOfYear = new DateTime(year, 1, 1);

        foreach (TimeZoneInfo.AdjustmentRule adjustmentRule in adjustmentRules)
        {
            if ((adjustmentRule.DateStart <= firstOfYear) && (firstOfYear <= adjustmentRule.DateEnd))
            {
                Console.WriteLine("In {0}, DST started on {1} and ended on {2}.",
                    year,
                    GetTransitionDate(adjustmentRule.DaylightTransitionStart, year).ToString("MMMM dd"),
                    GetTransitionDate(adjustmentRule.DaylightTransitionEnd, year).ToString("MMMM dd"));
            }
        }
    }

    public static DateTime GetTransitionDate
        (
        TimeZoneInfo.TransitionTime transitionTime,
        int year
        )
    {
        if (transitionTime.IsFixedDateRule)
        {
            return new DateTime(year, transitionTime.Month, transitionTime.Day);
        }
        else
        {
            if (transitionTime.Week == 5)
            {
                // Special value meaning the last DayOfWeek (e.g., Sunday) in the month.
                DateTime transitionDate = new DateTime(year, transitionTime.Month, 1);
                transitionDate = transitionDate.AddMonths(1);

                transitionDate = transitionDate.AddDays(-1);
                while (transitionDate.DayOfWeek != transitionTime.DayOfWeek)
                {
                    transitionDate = transitionDate.AddDays(-1);
                }

                return transitionDate;
            }
            else
            {
                DateTime transitionDate = new DateTime(year, transitionTime.Month, 1);
                transitionDate = transitionDate.AddDays(-1);

                for (int howManyWeeks = 0; howManyWeeks < transitionTime.Week; howManyWeeks++)
                {
                    transitionDate = transitionDate.AddDays(1);
                    while (transitionDate.DayOfWeek != transitionTime.DayOfWeek)
                    {
                        transitionDate = transitionDate.AddDays(1);
                    }
                }

                return transitionDate;
            }
        }
    }

吐出以下输出:

In 2000, DST started on April 02 and ended on October 29.
In 2001, DST started on April 01 and ended on October 28.
In 2002, DST started on April 07 and ended on October 27.
In 2003, DST started on April 06 and ended on October 26.
In 2004, DST started on April 04 and ended on October 31.
In 2005, DST started on April 03 and ended on October 30.
In 2006, DST started on April 02 and ended on October 29.
In 2007, DST started on March 11 and ended on November 04.
In 2008, DST started on March 09 and ended on November 02.
In 2009, DST started on March 08 and ended on November 01.
In 2010, DST started on March 14 and ended on November 07.
In 2011, DST started on March 13 and ended on November 06.
In 2012, DST started on March 11 and ended on November 04.
In 2013, DST started on March 10 and ended on November 03.
In 2014, DST started on March 09 and ended on November 02.
In 2015, DST started on March 08 and ended on November 01.
In 2016, DST started on March 13 and ended on November 06.
In 2017, DST started on March 12 and ended on November 05.
In 2018, DST started on March 11 and ended on November 04.
In 2019, DST started on March 10 and ended on November 03.
In 2020, DST started on March 08 and ended on November 01.
In 2021, DST started on March 14 and ended on November 07.
In 2022, DST started on March 13 and ended on November 06.
In 2023, DST started on March 12 and ended on November 05.
In 2024, DST started on March 10 and ended on November 03.
In 2025, DST started on March 09 and ended on November 02.
In 2026, DST started on March 08 and ended on November 01.
In 2027, DST started on March 14 and ended on November 07.
In 2028, DST started on March 12 and ended on November 05.
In 2029, DST started on March 11 and ended on November 04.

这篇关于.NET TimeZone.CurrentTimeZone.GetDaylightChanges返回错误的DST 2005的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆