DateTime差异运算符考虑夏令时?

时间:2009-05-01 08:09:58

标签: .net datetime operator-overloading dst

据我所知,DateTime类型的差异运算符考虑了闰年:所以

new DateTime(2008, 3, 1) - new DateTime(2008, 2, 1) // should return 29 days
new DateTime(2009, 3, 1) - new DateTime(2009, 2, 1) // should return 28 days

但是夏令时呢?

5 个答案:

答案 0 :(得分:3)

.NET无法正确处理夏令时,即使它可以提供您想要的答案。您想要错误的答案。

简短版:

  • .NET如何知道,由于能源危机,1977年夏令时全年都在生效?

  • 当以色列议会逐年决定规则时,.NET如何知道以色列的夏令时规则?

  • .NET如何知道美国在第二次世界大战期间全年都在DST上运行,从1945年到1966年,DST规则因区域而异,规则仍然因地区而异。

.NET尝试删除,并使用当前的夏令时规则,即使它们没有或将会生效。结果是你得到的答案虽然是你想要的,但是不正确。

来自 Raymond Chen 的博客文章Why Daylight Savings Time is nonintuitive

  

为什么(win32)时区转换功能不能使用适合一年中某个时间的时区?

     

...

     

Win32不会尝试猜测哪个   时区规则对此有效   其他时间。所以Win32说,“周四,   2002年10月17日太平洋标准时间上午8:45:38 “。

     

注意:太平洋标准时间。甚至   虽然10月17日是太平洋时期   日光时间,Win32显示时间   作为标准时间因为那是什么   时间现在

     

.NET说,“嗯,如果有规则的话   效果现在也生效了   那将是2003年10月17日   白天时间“所以它显示   “2003年10月17日星期四上午9:45   PDT“ - 白天时间。

所以你得到的答案是错误的。但既然你期待错误的答案,那就是你得到的。

答案 1 :(得分:2)

夏令时比一般的12个时区以及哪些国家/地区使用它们更具体。

不同的国家或国家/地区组使用不同的日期来确定DST。

有点痛苦,更不用说那些不这样做的国家,或者部分国家。

例如昆士兰州,除了该国其他地区外,澳大利亚还有DST。

如果不这样做,我不会感到惊讶,如果不这样做,那么至少可以用cultureinfo 9来做它。

答案 2 :(得分:2)

我认为不会。 The documentation只是说DateTime被存储为自0001年1月1日午夜12:00起的滴答数,但它没有说午夜实际上是哪个TimeZone - 我将不得不假设如果它始终存储在UTC内部,他们会这样说。

你可以轻松解决这个问题:只做:

var difference = Dt1.ToUniversalTime() - Dt2. ToUniversalTime()

并且转换为UTC将考虑夏令时

答案 3 :(得分:1)

它不会,它实际上不能,基于它不会强迫您使用UTC构建DateTime这一事实也不允许您指定DST是否生效当您使用本地时间值构造DateTime时。此外,它允许模式(LT或UTC)“未指定”,这只是as。。

通过允许从Local Time值构造DateTime值,可以构造一个不明确的DateTime值(指定为Local Time)(例如,美国11月2日凌晨1点到2点之间的任何时间,当地时间小时重复自己)并且不能确定地转换回UTC,除非构造函数提供了一个参数来指定DST是否对给定的本地时间有影响

由于它没有提供此类参数,因此DateTime类的设计不完整且存在缺陷,未能正确考虑正确指定本地时间所需的所有参数。

我认为这就是为什么他们创建了DateTimeOffset类,如果你感到困惑,为什么会出现这样一个看似多余的类......这就是原因。

因此,您不应该对未设置为DateTimeMode.Utc的任何DateTime实例进行任何计算。仅使用UTC。你实际上无法转换为LT或从LT转换,因为它两种方式都有两种不同的错误。 1.从LT到UTC已被破坏,因为如上所述,它不允许您指定DST是否对LT中的那个模糊小时有效。哦,它还允许您指定基本上不可能的本地小时,例如我们在提前设置时跳过的小时。 2.当将过去的UTC值转换为本地时间时,Windows会根据它是否现在生效来抵消DST,而不是给定的时间,这是严重的asinine。当然,当您在文件名中记下,存储或使用修改时间时,您可能已经注意到此问题,有一天在Windows资源管理器中显示HOUR OFF。不,你并不疯狂,Windows只是有一个严重的错误,他们从来没有找到时间来修复DOS和最新的.NET框架(约20年)之间的某个地方!当然,该bug会影响CVS系统以及跟踪修改时间的任何内容。 FAT文件系统将时间存储为本地时间,这意味着它只是完全搞砸了。

答案 4 :(得分:0)

测试并查看!

就像你为DST案例所做的那样编写测试就像闰年案例一样容易。