【问题标题】:DateTime error Subtracting from 0 hourDateTime 错误从 0 小时减去
【发布时间】:2021-06-16 04:17:44
【问题描述】:

使用 C# DateTime,我想减去过去 0(或午夜)的时间。但是,这样做时出现错误。我正在尝试创建一个时间线,您可以在其中放大和缩小并滚动浏览时间。我收到以下错误:“添加或减去的值导致无法表示的 DateTime。”

我猜 DateTime 不知道如何从 0 回绕到 23?我该如何解决这个问题?

【问题讨论】:

  • 请发布您的代码,以便我们看到您在做什么。
  • 欢迎来到stackoverflow。仅供参考,没有足够信息的问题往往会被关闭或否决。只要有可能,请务必包含SSCCE。它使其他人更容易帮助您解决问题。

标签: c# datetime time subtraction


【解决方案1】:

如果你从DateTime 中减去TimeSpan,它将在午夜过后“环绕”:

> var d1 = DateTime.Parse("4/11/2012 12:30:00 AM");
> var d2 = d1.Subtract(new TimeSpan(1, 15, 0));
> 
> d2
[4/10/2012 11:15:00 PM]

【讨论】:

  • 除非它小于 DateTime.MinValue,正如 Jon Skeet 在 his answer 中发布的那样。
  • 正确,但在什么情况下您希望表示小于01/01/0001 00:00:00 的日期/时间?如果你需要DateTime 来做这件事,那么你很可能遇到了更大的设计问题。
  • 不知道。但如果没有来自 OP 的更多信息,我们不知道尝试了什么。那么你将如何代表公元前 10,000 年?
  • 除了DateTime 之外的其他一些数据结构,在极少数情况下您需要将BC 时间表示到毫秒(这是DateTime 能够做到的)。 :)
  • 你说的都是对的。问题是因为我只关心日期时间的小时、分钟、秒部分,所以 dt 对象已被初始化为 MinValue。因此,当我尝试减去该日期的午夜时,它会引发错误。我将日期初始化为其他东西,它工作正常。再次感谢!
【解决方案2】:

我的猜测是您使用的是从DateTime.MinValue 开始的日期。如果您减去时间使其在DateTime.MinValue 之前,您将得到该异常。

// This is equal to DateTime.MinValue - maybe you're doing this?
DateTime date = new DateTime();
// Bang
date = date.AddHours(-1);

如果您真的想要“只是一次”表示,请考虑使用Noda Time,我的Joda Time 的伪端口,其类型系统比DateTime 更丰富。

【讨论】:

    【解决方案3】:

    从设置为午夜的 TimeSpan 中减去 5 分钟,结果为 -00:05。这导致时间跨度为 23:55 而不是 -00:05。

    DateTime.Today.Subtract(TimeSpan.FromMinutes(5)).TimeOfDay;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 2011-05-15
      • 2012-06-24
      • 1970-01-01
      相关资源
      最近更新 更多