时区 UTC 夏令时 冬令时

daylight saving 夏令时

我们国家小学生上下学的时候。也有叫冬令时和夏令时。 (但是这个只是调整上下学的时间)

有的国家比如荷兰夏令时 时间直接向前调整1个小时。 冬令时 的时候再把时音向后调整一个小时。

这样它跟UTC 时间差就会从1个小时变成差两个小时。

从冬令时调到夏令时 时间是没有问题的。

但是从夏令时调回到冬令时时间就会有重复的现象了。

阿姆斯特丹在当地时间 2021年03月28日,02:00:00 时钟向前调整 1 小时 变为 2021年03月28日,03:00:00,开始夏令时

阿姆斯特丹在当地时间 2021年10月31日,03:00:00 时钟向后调整 1 小时 变为 2021年10月31日,02:00:00,结束夏令时 daylight saving

假设我们做的是荷兰国家的程序。 然后用的时间是 本地时间 DateTime.Now。 这样时间段就有可能重复。 如果我们做的是某个定时的程序也有可能导致它重复运行。

而且这个时间的调整不是固定的。每年的时间段也不太一样

    private static readonly TimeZoneInfo ZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
    var offset = ZoneInfo.GetUtcOffset(time); //通过这个方法我们可以知道当前的差值

    DateTime unclearDate = new DateTime(2007, 11, 4, 1, 30, 0);

// 是不是 模糊两可的时间段
Console.WriteLine("In the {0}, {1} is {2}ambiguous.", 
                  ZoneInfo.DisplayName, 
                  unclearDate, 
                  ZoneInfo.IsAmbiguousTime(unclearDate) ? "" : "not ");
// 是不是夏令时
Console.WriteLine("In the {0}, {1} is {2}daylight saving time.", 
                  ZoneInfo.DisplayName, 
                  unclearDate, 
                  ZoneInfo.IsDaylightSavingTime(unclearDate) ? "" : "not ");
Console.WriteLine();    

可以写一个方法来把 荷兰时间转成UTC

        public static DateTime DutchToUtc(DateTime time)
        {
            if (time.Kind == DateTimeKind.Unspecified)
            {
                var offset = ZoneInfo.GetUtcOffset(time);
                return new DateTimeOffset(time, offset).UtcDateTime;
            }

            return time.ToUniversalTime();
        }

https://learn.microsoft.com/en-us/dotnet/api/system.timezoneinfo.isdaylightsavingtime?view=net-5.0

最近更新的
...