我们国家小学生上下学的时候。也有叫冬令时和夏令时。 (但是这个只是调整上下学的时间)
有的国家比如荷兰夏令时 时间直接向前调整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
``` csharp
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();
}
public static class DateTimeExtensions
{
private static readonly TimeZoneInfo Zone;
static DateTimeExtensions()
{
var zoneId = "W. Europe Standard Time";
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
zoneId = "Europe/Amsterdam";
}
Zone = TimeZoneInfo.FindSystemTimeZoneById(zoneId);
}
public static DateTime ToDutchTime(this DateTime utcDate)
{
return TimeZoneInfo.ConvertTimeFromUtc(utcDate, Zone);
}
// Kind of dtuchDate should be Unspecified
public static DateTime DutchTimeToUtc(this DateTime dutchDate)
{
return TimeZoneInfo.ConvertTimeToUtc(dutchDate, Zone);
}
}
https://learn.microsoft.com/en-us/dotnet/api/system.timezoneinfo.isdaylightsavingtime?view=net-5.0
EFcore 我们存到数据库的时间是Utc 但是读出来的Kind实际上是 Unspecified的
DateTime 比较的时候它忽略了时区。