C#与Delphi中日期/时间计算的差异

11

Delphi:

SecondsBetween(StrToDateTime('16/02/2009 11:25:34 p.m.'), StrToDateTime('1/01/2005 12:00:00 a.m.'));

130289133

C#:

TimeSpan span = DateTime.Parse("16/02/2009 11:25:34 p.m.").Subtract(DateTime.Parse("1/01/2005 12:00:00 a.m."));

130289134

它也不是一致的。有些日期会加起来相同,例如..

TimeSpan span = DateTime.Parse("16/11/2011 11:25:43 p.m.").Subtract(DateTime.Parse("1/01/2005 12:00:00 a.m."));

SecondsBetween(StrToDateTime('16/11/2011 11:25:43 p.m.'), StrToDateTime('1/01/2005 12:00:00 a.m.'));

both give

216905143

总秒数实际上用于编码数据,我正在尝试将应用程序转移到C#,因此即使一个秒钟也会完全使一切失效。

有人能解释这种差异吗?有没有办法让C#与Delphi匹配?

编辑:针对可能与闰秒有关的建议的回应:两个日期范围都包含相同数量的闰秒(2),因此您会期望两者都不匹配。但是我们看到的是不一致性。

16/02/2009 - 1/01/2005 = Delphi and C# calculate a different total seconds

16/11/2011 - 1/01/2005 = They calculate the same total seconds

有趣的问题,但你应该提出一个问题。 - Austin Salonen
也许这两个系统对闰秒的处理方式不同? - Sergey Kalinichenko
@Austin Salonen 我为你添加了问题部分 :P - NoPyGod
你是在尝试对值进行编码而不是解析字符串吗?我问这个问题是因为我使用了这个句子 SecondsBetween(EncodeDateTime(2009,2,16,23,25,34,0), EncodeDateTime(2005,1,1,0,0,0,0)) 进行了代码测试,结果在两种语言中都是一样的(130289134)。 - RRUZ
1
@NoPyGod 我发现了这个QC 59310,这个bug已经在Delphi XE中修复了。 - RRUZ
显示剩余5条评论
3个回答

7
似乎这个问题与QC 59310有关,该错误已在Delphi XE中修复。

1
鉴于此,我该如何在C#中模拟这个bug?我正在尝试移植一个应用程序,如果我偏差一秒钟,整个应用程序的解码部分就会混乱。感谢您发现这些信息,非常有帮助。 - NoPyGod
@NoPyGod 在C#中你无法消除它,因为这是在Delphi的一侧。你可以在那里重新引入它,但这可能会是一个太过hack的方法。尝试使用“days between”(假设有这样的方法),然后手动计算两个没有日期时间差异的时间之间的差异。 - Sergey Kalinichenko

0

在编程中,你可能会遇到 闰秒。不过,据我所知,.NET 并没有对此进行处理。


两个日期范围包含相同数量的闰秒,但其中一个被正确计算。 - NoPyGod
@NoPyGod,如果一个考虑了闰秒而另一个没有考虑,则会导致差异。 - Mark Ransom
我比较了两种语言在两个不同日期范围内的结果。其中一个案例中结果匹配。这两个日期范围包含相同数量的闰秒。 - NoPyGod

0
你没有提到如何将C#的TimeSpan转换为数字。TotalSeconds属性是一个浮点值——也许这是双精度转整数时出现的舍入问题?

只需使用普通的强制类型转换 (int)。 - NoPyGod
双精度浮点数的值仍然不正确。但你说得对,我不应该省略那个细节。 - NoPyGod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接