9

据我所知,该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

但是夏令时呢?

4

5 回答 5

3

.NET 不能正确处理夏令时,即使它提供了您想要的答案。你想要不正确的答案。

简洁版本:

  • .NET 怎么知道由于能源危机,1977 年夏时制是全年有效的?

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

  • .NET 怎么知道美国在二战期间全年都使用 DST,并且从 1945 年到 1966 年,DST 规则因地区而异,而且规则仍然因地区而异。

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

来自Raymond Chen的博客文章,为什么夏令时不直观

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

...

Win32 不会尝试猜测在其他时间生效的时区规则。所以 Win32 说,“星期四,2002 年 10 月 17 日,太平洋标准时间上午 8:45:38 ”。

注:太平洋标准时间。尽管 10 月 17 日是太平洋 夏令时间,但 Win32 仍将时间显示为标准时间,因为那是现在的时间。

.NET 说,“好吧,如果现在生效的规则也在 2003 年 10 月 17 日生效,那么那将是夏令时”,因此它显示“2003 年 10 月 17 日星期四,太平洋夏令时间上午 9:45” - 夏令时.

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

于 2010-01-10T21:33:29.773 回答
2

夏令时比一般的 12 个时区和使用它们的国家更具体。

不同的国家或国家组使用不同的日期来确定 DST 的发生时间。

它有点痛苦,更不用说不这样做的国家或国家的部分地区了。

例如昆士兰,非盟没有 DST,尽管该国其他地区有。

如果它不这样做,我不会感到惊讶,如果它这样做的话,至少没有文化信息 9 就无法做到)。

于 2009-05-01T08:21:42.433 回答
2

我不认为它会。文档只是说 DateTime 存储为自 0001 年 1 月 1 日午夜 12:00:00 以来的滴答数,但它没有说明午夜实际在哪个 TimeZone - 我不得不假设如果它是总是以UTC内部存储,他们会这么说。

不过,您可以轻松解决此问题:只需执行以下操作:

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

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

于 2009-05-01T08:43:20.323 回答
1

它不会,实际上不能,因为它既不会强制您使用 UTC 来构造 DateTime ,也不会允许您在构造具有本地时间值的 DateTime 时指定 DST 是否有效. 此外,它允许“未指定”模式(LT 或 UTC),这只是 asinine。

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

由于它没有提供这样的参数,DateTime 类的设计是不完整和有缺陷的,未能考虑正确指定本地时间所需的所有参数。

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

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

于 2009-11-04T21:56:18.963 回答
0

测试一下看看!

编写测试就像为 DST 案例和闰年案例一样容易。

于 2009-05-01T08:19:38.243 回答