据我所知的差分运算符 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

但是夏令时呢?

有帮助吗?

解决方案

我认为不会。 文档只是说存储了DateTime作为自0001年1月1日午夜12:00:00以来的刻度数,但它没有说明午夜实际上是在哪个TimeZone中 - 我将不得不假设如果它始终存储在UTC内部,他们会说如此。

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

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

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

其他提示

.NET 无法正确处理夏令时,尽管它给出了您想要的答案。你 错误的答案。

简洁版本:

  • .NET 如何知道 1977 年由于能源危机而全年实行夏令时?

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

  • .NET 是如何知道美国在二战期间全年都实行 DST 的,从 1945 年到 1966 年,DST 规则因地区而异,并且规则仍然因地区而异。

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

陈雷蒙德的博客条目, 为什么夏令时不直观:

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

...

Win32在其他时候没有试图猜测哪个时区规则有效。所以 Win32 说:“2002年10月17日,星期四8:45:38 AM PST".

笔记: 太平洋 标准 时间。即使10月17日在太平洋 日光 时间,win32显示时间为标准时间,因为那是什么时候 现在.

.NET 说:“好吧,如果现在有效的规则也有效于2003年10月17日,那将是日光的时间2003年10月17日(星期四)上午9:45 pdt” - 日光时间。

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

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

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

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

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

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

它不会,它实际上不能,基于它不会强迫您使用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文件系统将时间存储为本地时间,这意味着它只是完全搞砸了。

测试并查看!

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top