7

多年来,我遇到了对一天结束的不同解释。 但是在比较日期和时间间隔时,正确的表示方式是什么?

我发现有些人似乎更喜欢23:59:59,而其他人则使用00:00:00
在 StackOverflow 上,我什至发现了一些与24:00:00的使用和显示有关的问题实例,但是这个问题的范围更侧重于确定如何划分两天。

换句话说,我们感兴趣的问题是确定一天到底在哪里结束,下一天从哪里开始。在许多甚至需要最基本的时间间隔比较或计算的应用程序中,这似乎是一个常见问题。

为了澄清上述解释,以下是代表 2014 年 1 月 1在三种不同解释下的三个示例:

  1. 准午夜2014-01-01 00:00:00 - 2014-01-01 23:59:59
  2. 午夜锋利2014-01-01 00:00:00 - 2014-01-02 00:00:00
  3. 军事午夜2014-01-01 00:00:00 - 2014-01-01 24:00:00

虽然我确实觉得准午夜解释是最直观的解释,但它似乎也需要相当多的样板才能正确地指出时间。此外,当没有正确处理一天的最后一秒时,可能会遇到边缘情况,或者在扫描大量间隔以围绕这些差距进行测试时,可能会影响性能。

同样,军事午夜解释似乎也需要一些样板来设置该划分点的双重表示。没有太多思考,我想不出使用这种方法的许多并发症。

最后,午夜尖锐的解释似乎是最一致的一个很好的候选者。与午夜准不同,它不需要样板来设置时间,并且它自然地与运算符<<=和.>>=

值得注意的是,PHP 语言已经解释2014-01-01 24:00:002014-01-02 00:00:00,具有将日期转换为深夜解释的效果。

在示例性 FLOSS 库或标准中是否有明显的先例可以证明使用一种解释而不是另一种解释?

4

5 回答 5

5

00:00:00是新的一天的开始。

23:59:59是旧日的最后一秒,但还有一秒要走,23:59:59.999旧日的最后一毫秒也是如此。不过,它仍然不是一天的结束,还有 1 毫秒的时间。

这取决于你需要做什么。如果您想检查某个事件是否在午夜之前发生(例如,您正在查询 MySQL 数据库),<那么新一天开始时的操作员会这样做,因为它可以满足您拥有的任何粒度(纳秒、微秒等)。

如果你想检查新的一天是否发生了什么事情,它必须是>=新一天的开始,即00:00:00

于 2014-10-07T23:07:15.760 回答
5

首先让我们回顾一下数学中的开区间和闭区间

  • 开区间不包括其端点,并用括号表示。例如(0,1)表示大于 0 小于 1。
  • 闭区间包括其端点,并用方括号表示。例如[0,1]表示大于或等于 0 且小于或等于 1。

我认为没有人会不同意这一天从 time 开始00:00:00.000000...这意味着在该点之前的任何秒、毫秒、微秒等都落在前一天。

我们通过使用左闭右开区间来表达这个概念。所以:

2014 年 1 月 1 日这一天跨越时间["2014-01-01 00:00:00", "2014-01-02 00:00:00")

这意味着午夜尖锐是正确的。00:00:00但是,这将要求您的机器具有无限的分辨率来代表第二天之前的所有这些非常非常小的时间单位。

由于没有数字系统可以具有无限的分辨率,我们不得不承认准午夜,这将是一个封闭的区间。右端点的确切值取决于系统的分辨率。

正如 MikeW 所说:

2014 年 1 月 1 日这一天跨越时间
["2014-01-01 00:00:00", "2014-01-02 00:00:00"-system_resolution]

如果您的环境/语言/数据结构仅提供一秒的分辨率,那么一天的最后一刻是在23:59:59. 对于一毫秒的分辨率,那将是23:59:59.999.

因此,从本质上讲,准午夜午夜尖锐都是正确的,但准午夜的终点取决于您的分辨率。


在实践中,我认为您不必担心!只需使用DateTime您的语言提供的类似对象/API,以及适当的条件运算符(伪代码):

if DateTime.Now() < DateTime("2000-01-01 00:00:00"):
    // Worry about Y2K bugs
于 2014-10-07T23:08:15.810 回答
1

那么,“什么是正确的表示方式?” 是一个主观问题,所以无法回答。也就是说,大多数“时钟”应用程序和系统时钟将其表示为上面的“准午夜”,因此如果您希望向用户表示时间的一致性,您可能应该使用它。

但是,如果您没有直接向用户显示时间,而是将其用作其他计算的一部分,那么它可能是特定于应用程序的。

这个页面这个页面提供了很多关于时间问题的例子,以及主观“正确性”如何取决于你的应用程序。

于 2014-10-07T23:05:34.977 回答
1

IMO,它主要归结为*您对手头问题的实际要求和*您可以使用的工具/语言的时间分辨率。

毕竟,用抽象的术语很容易过度思考任何问题。

话虽如此,我个人更喜欢严格小于 (<) 00:00:00

于 2014-10-07T23:07:49.360 回答
1

传统上,日期时间数据类型表示为浮点数。整数部分是从预定时期算起的天数,尾数或小数部分构成时间偏移。有许多不同的时期和许多不同的方式来存储日期时间。我主要观察到一天的开始时间为 01/01/2001 12:00:00 AM,一天的结束时间被视为 01/01/2001 11:59:59 PM。

考虑它的一个好方法是从午夜减去一秒将产生前一天的 11:59:59,然后再加上第二秒,它又会是午夜。

特定日期的午夜值将使用上述历元以相同的方式存储。12 小时 24 小时 Zulu 语义只是选择了日期时间值的显示设置。

于 2014-10-07T23:18:35.607 回答