DateTime差异计算的OverflowException

use*_*105 -1 .net c# floating-point datetime

我在这个小片段上得到一个奇怪的错误:

private int CalculateDifference(DateTime date1, DateTime date2)
{
    var difference = date1 - date2;
    return Math.Abs((int)difference.TotalSeconds);
}
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我正在计算3520789176.4909997总秒数的差异.该程序抛出了我在C#编码十年中从未见过的异常​​:

System.OverflowException: "Negating the minimum value of a twos complement number is invalid."

我很确定它与浮点算术相关,但我不了解细节,我只需要一个足够的解决方案来确定两个日期值的差异.

p.s*_*w.g 6

的问题是,当一个双超过可以在一个表达值的范围int-其2,147,483,6482,147,483,647根据C#规范(参见,结果是不明确的叶普斯蒂尼尔森的评论在下面),但在.NET实现,是int.MinValue.所以当你转换difference为a时int,它取值-2,147,483,648然后不能用它来否定Math.Abs

如果您将此方法转换为使用long,它应该工作:

private long CalculateDifference(DateTime date1, DateTime date2)
{
    var difference = date1 - date2;
    return Math.Abs((long)difference.TotalSeconds);
}
Run Code Online (Sandbox Code Playgroud)

您也可以通过int在获取绝对值后转换为简单来解决此问题:

private int CalculateDifference(DateTime date1, DateTime date2)
{
    var difference = date1 - date2;
    return (int)Math.Abs(difference.TotalSeconds);
}
Run Code Online (Sandbox Code Playgroud)