什么是正确的日终解释?

met*_*rso 7 date date-arithmetic date-manipulation

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

我发现有些人似乎更喜欢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图书馆或标准中是否有明显的先例可以证明使用一种解释而不是另一种解释?

jbx*_*jbx 6

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

23:59:59是旧时代的最后一秒,但仍有一秒钟,23:59:59.999旧时代的最后一毫秒也是如此.它仍然不是一天结束,但还有1毫秒.

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

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


Jon*_*art 6

首先让我们回想一下数学的开放和闭合区间:

  • 打开间隔不包括其端点,并用括号表示.例如,(0,1)意味着大于0且小于1.
  • 闭合间隔包括其端点,并用方括号表示.例如,[0,1]意味着大于或等于0且小于或等于1.

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

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

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

这意味着午夜尖锐是正确的.然而,这需要你的机器具有无限的分辨率来代表所有那些真正的,非常小的时间单位00:00:00在第二天之前.

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

正如迈克所说:

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
Run Code Online (Sandbox Code Playgroud)

  • @Andrea基本上,我认为你对这个问题的思考太过分了.当我们用英语说"午夜之前"时,我们可以用PHP和.NET表达我们的意思.时间"00:00:00"*始终*仅在一天开始时发生.在此之前的任何子单位都在前一天. (2认同)