【问题标题】:Best method to find difference between two DateTime objects? [closed]找出两个 DateTime 对象之间差异的最佳方法? [关闭]
【发布时间】:2019-11-27 08:50:54
【问题描述】:

我想找出两个 DateTime 对象之间的区别。我知道我可以使用 DateTime.Subtract() 和重载运算符“-”(例如 DateTime - DateTime)。但是有人告诉我,这两种技术都不够好,还有一个方法DateDiff什么的,我应该用哪个最好用。我想知道是不是真的?如果是,那么从任何角度来看,以上两者如何逊色?

【问题讨论】:

  • But someone told me that these two techniques are not good enough 他们撒谎了。除非这是在非常具体的情况下(例如 EF),在这种情况下 docs.microsoft.com/en-us/dotnet/api/… 可能值得一读。
  • DATEDIFF 是与 C# 无关的 T-SQL function。如果您听到有人声称某种技术优于或低于另一种技术,请要求他们用事实和文件来支持这种说法。如果他们做不到,请忽略他们。这种说法可能在实体框架查询的上下文中有意义,但仍然需要更多的上下文和证明。
  • @CodeCaster 还有docs.microsoft.com/en-us/dotnet/api/…。但同样,我无法想象为什么人们会说应该使用它。
  • 请向我们展示两个日期输入以及您想要的结果,以区分这两个日期。这将有助于我们更好地了解您的问题。

标签: c# .net datetime


【解决方案1】:

DateDiff 不比较 dateTime 实例。
它比较 DateTime 实例的特定部分 - 例如,月份或小时。

例如:

var lasyDayOf2018 = new DateDime(2018, 12, 31);
var firstDayOf2019 = lasyDayOf2018.AddDays(1);
var monthDiff = DateDiff(DateInterval.Month, lasyDayOf2018, firstDayOf2019)

monthDiff 将为 1,即使这两个日期之间只过去了一天。

它记录在DateDiff 文档页面的备注部分:

如果 Interval 设置为 DateInterval.Year,则返回值仅根据 Date1 和 Date2 的年份部分计算。同样,DateInterval.Month 的返回值纯粹根据参数的年份和月份部分计算得出,而 DateInterval.Quarter 的返回值则根据包含两个日期的季度计算得出。

例如,当比较 12 月 31 日和次年的 1 月 1 日时,DateDiff 为 DateInterval.Year、DateInterval.Quarter 或 DateInterval.Month 返回 1,即使最多只过去了一天。

要获得DateTime 不同实例之间的实际差异,请使用Subtract-,正如您在问题中所写的那样。

【讨论】:

    【解决方案2】:

    是否存在问题,该问题的解决方案实际上取决于具体情况以及您计算差异的原因。 DateTime.Subtract()operator - 有两个主要问题。

    首先是它们都忽略了数据的时区部分。因此,例如,如果您有两个日期,2019-07-18 12:00:00 UTC 和 2019-07-18 06:00:00 MDT(当地时间),即使它们代表相同的时间点(如从不同时区测量),DateTime.Subtract() 会告诉你它们相隔 6 小时。

    第二个问题是你经常想知道答案,而不是刻度,有时甚至无法转换为固定数量的刻度。例如,如果您想要两个 DateTimes 所代表的月份的差异,则无法根据刻度的差异(这是 DateTime.Subtract() 所基于的)来计算,因为不同的月份有不同的长度。例如,对于日期“2019-06-30 23:59:59”和“2019-07-01 00:00:00”(在同一时区),只有一秒的差异,但月份是不同,那么月份的差异是一还是零?这取决于您想将答案用于什么。

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 1970-01-01
      • 2021-02-17
      • 2021-02-18
      • 1970-01-01
      • 2017-12-21
      • 2012-02-08
      • 2015-10-25
      • 1970-01-01
      相关资源
      最近更新 更多