2

DateTime我在 .NET 的处理中遇到了可能是闰年,特别是ToLocalTime(). 这是一些重现问题的代码(我在太平洋时区):

DateTime dtStartLocal = DateTime.Parse("2009-02-28T23:00:00.0-08:00");
DateTime dtEndLocal = dtStartLocal.AddYears(3);
DateTime dtStartUtc = dtStartLocal.ToUniversalTime();
DateTime dtEndUtc = dtStartUtc.AddYears(3);
DateTime dtEndLocal2 = dtEndUtc.ToLocalTime();
DateTime dtStartLocal2 = dtStartUtc.ToLocalTime();
Console.WriteLine("START: 1={0}, 2={0}", dtStartLocal, dtStartLocal2);
Console.WriteLine("END  : 1={0}, 2={1}", dtEndLocal, dtEndLocal2);
Console.ReadLine();

输出是:

开始:1=2/28/2009 晚上 11:00:00,2=2/28/2009 晚上 11:00:00
结束:1=2/28/2012 晚上 11:00:00,2=2/29 /2012 晚上 11:00:00

请注意,我所做的变量ToUniversalTime().AddYears(3).ToLocalTime()与 just 不同AddYears(3),它提前一天。

有没有人遇到过这个?如果这是预期的,有人可以解释其背后的逻辑吗?

注意:是的,最好的方法是完全在 UTC 中工作,而不是在它们之间翻转。这不是影响我的东西,而是我遇到的特殊情况。本质上我误解了它是如何AddYears()工作的,现在我可以看到它为什么在做它正在做的事情(请参阅下面我选择的答案)。

4

3 回答 3

10

我认为这工作正常。

DateTime dtStartUtc = dtStartLocal.ToUniversalTime();

PST 是 UTC-8。因此,这会将时间转换为 2009 年 3 月 1 日 07:00:00。

DateTime dtEndUtc = dtStartUtc.AddYears(3);

这比上一次增加了三年,即 2012 年 3 月 1 日 07:00:00。

DateTime dtEndLocal2 = dtEndUtc.ToLocalTime();

这会将结束时间转换回 PST,即 2012 年 2 月 29 日 11:00:00。

我想说这只是在本地时间和 UTC 时间之间转换的副作用。

于 2009-03-02T20:57:53.523 回答
0

打印时区/校正因子。当您执行 .ToUniversialTime() 时,它实际上会从您的原始时间(“-08:00”)添加 8 小时,这将从 2 月 28 日 23:00 开始的第二天 11:00。因此,当您将其添加 3 年时,即为 29 日上午 11:00。如果你做了2年,那就是3月1日,它与闰年无关。

于 2009-03-02T20:57:05.490 回答
0

据我所知,这种行为并不正确。当您将本地时间转换为 UTC 时,它会有效地将其推到第二天;3 月 1 日。当您添加三年时,它将保持为 3 月 1 日。将其转换回当地时间并回滚到前一天,因为 2012 年是闰年,所以是 2 月 29 日。

于 2009-03-02T21:06:39.943 回答