Datetime隐式转换为Datetimeoffset是否会导致不正确的偏移?

Datetime隐式转换为Datetimeoffset是否会导致不正确的偏移?,datetime,timezone,dst,timezone-offset,datetimeoffset,Datetime,Timezone,Dst,Timezone Offset,Datetimeoffset,当我试图确定给定的datetimeoffset是否发生在时区调整(夏令时)的开始或结束时,我注意到一些奇怪的事情。 我不确定我是否走错了路 以以下代码为例: class Program { static void Main(string[] args) { // Note: this is done on a swedish computer. int year = 2015; DateTimeOffset dateTimeJust

当我试图确定给定的datetimeoffset是否发生在时区调整(夏令时)的开始或结束时,我注意到一些奇怪的事情。 我不确定我是否走错了路

以以下代码为例:

class Program
{
    static void Main(string[] args)
    {
        // Note: this is done on a swedish computer.
        int year = 2015;
        DateTimeOffset dateTimeJustBeforeOffsetChanges = new DateTime(year, 10, 25, 1, 59, 59);
        DateTimeOffset dateTimeRightWhenOffsetChanges = new DateTime(year, 10, 25, 2, 0, 0); // 2015-10-25 02:00:00. This is how we set our offset. We let the implicit conversion do all the work :)

        var daylightSavings = TimeZone.CurrentTimeZone.GetDaylightChanges(year);

        Console.WriteLine(dateTimeJustBeforeOffsetChanges); // Prints out 2015-10-25 01:59:59 +02:00
        Console.WriteLine(dateTimeRightWhenOffsetChanges); // Prints out 2015-10-25 02:00:00 +01:00 This is the exact time when the datetimeoffset starts using offset +02 instead of +01
        Console.WriteLine(daylightSavings.End.ToString()); // Prints out 2015-10-25 03:00:00
        Console.ReadLine();
    }
}
从上面的代码中可以看到,当使用从datetime到datetimeoffset的隐式转换时,偏移量在10月25日凌晨2点从+1小时更改为+2小时。然而,当使用GetDaylightChanges方法分析当前的daylightsavings时,我们被告知更改应该发生在10月25日3点

在我的头脑中,偏移量应该在3点钟变为+2,而不是2点钟,还是我错了


PS:此代码在瑞典机器上运行,并带有瑞典时区设置。

首先,
GetDaylightChanges
是准确的-正确的

第二,这并不意味着你在BCL中的任何地方都出现了bug。问题很简单,02:00:00发生了两次——一次在时钟倒转之前,一次在时钟倒转之后。换句话说,它发生在2015-10-25 02:00:00+02:00和2015-10-25 02:00:00+01:00。您如何期望隐式转换来判断您的意思?这两个结果都是有效的,而且它恰好选择了后面的结果,尽管不幸的是,这种行为未被指定,至少在隐式转换文档和
DateTimeOffset
构造函数文档中是如此

这就是为什么在我的库中,当您从
LocalDateTime
映射到
ZoneDateTime
(通过应用时区)时,如果值不明确或被跳过,您必须说明希望发生什么-因此在本例中,您可以选择将其解析为2015-10-25 02:00:00的较晚或较早事件


基本上,这是您应该考虑的事情,并决定您希望应用程序如何运行。。。然后,您应该使用您正在使用的任何API来指定您想要的行为。这在某些API中比在其他API中更容易:)

您通常应该避免使用
时区
-
时区信息
通常是一个更合适的类,尽管我个人仍然觉得它有些讨厌。顺便说一句,所有这些在我的野田佳彦时间项目中都比较简单:)是的,当我读到一个更简单的使用TimeZone类的方法时,我实际上开始使用timezoneinfo编写这个半大型方法。作为旁注:同样的问题发生在daylightsavings启动时。这几乎就好像“GetDaylightChanges”方法返回的datetime是UTC datetime…也许我误解了,但您在这个问题中反复说“偏移量从+1小时更改为+2小时。”你不是说从+2小时到+1小时吗?接受你的回答,因为你以帮助我解决问题的方式解释了问题:)。最后,我使用daylightsavings delta来确定提供的日期是在时区调整的开始还是结束。