【问题标题】:C# AddMonths() Exception The added or subtracted value results in an un-representable DateTImeC# AddMonths() 异常添加或减去的值导致无法表示的 DateTIme
【发布时间】:2020-08-25 10:57:02
【问题描述】:

我已成功记录了指向此代码的错误

DateTime retDate = enddate;
if (enddate.Day > 1)
{
    retDate = enddate.AddDays(1 - enddate.Day).AddMonths(1);
}

System.ArgumentOutOfRangeException:增加或减少的值 导致无法表示的日期时间。参数名称:月
在 System.DateTime.AddMonths(Int32 个月)

这是在数据库中记录的,但我无法再重现该问题。我尝试使用每个日期,包括一个新的 DateTime(),但如果检查将其踢出。 逻辑按预期工作,但我只是想为那个边缘情况找到并创建一个句柄。

【问题讨论】:

  • 代码或数据库是否使用像 DateTime.MaxValue 这样的“神奇”值而不是 null 或缺少日期?那可不是个好主意。 SQL 的 NULL与编程语言中的 NULL 相同。它有一个非常具体的含义 - 该字段没有有效值。
  • 我知道这可能是个问题

标签: c# .net datetime


【解决方案1】:

以下代码将给出该异常:

DateTime enddate = DateTime.MaxValue.AddDays(-1);
DateTime retDate = enddate;

if (enddate.Day > 1)
{
    retDate = enddate.AddDays(1 - enddate.Day).AddMonths(1);
}

这就是你要找的吗?

【讨论】:

  • 是的,我知道这会如何创建此异常,我可能会为这种情况添加一个句柄,即使我认为这不是导致此问题的原因。介意我问一下第一个像 AddDays(-1) 的意义何在
  • @FarisKapo 第一个AddDays(-1) 是为了使.AddDays(1 - enddate.Day) 不会引发异常。如果你尝试做DateTime.MaxValue.AddDays(1) 你当然会得到一个例外。
【解决方案2】:

当生成的日期时间小于 MinValue (00:00:00.0000000 UTC, 0001 年 1 月 1 日) 或大于 MaxValue (23:59:59.9999999 UTC, 9999 年 12 月 31 日) 时,将引发 AddMonths() 的 ArgumentOutOfRangeException .

由于您添加了一个月,因此“enddate”中介于 02.December 9999 和 31.Dezember 9999 之间的每个日期值都会导致 01. January 10000,这是无法表示的。

【讨论】:

    猜你喜欢
    • 2013-10-16
    • 1970-01-01
    • 2021-06-02
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2021-08-02
    • 1970-01-01
    相关资源
    最近更新 更多