编程中关于日期结束的争议

一天何时终:时间范围的数学与代码解析

问题

我们做一个选择题,今天的结束时间是()。
A. 23:59:59
B. 23:59:59.999
C. 24:00:00
D. 00:00:00(第二天的零时)

问题由来

这编程过程中,经常需要查询某一个时间段内的数据,特别是某一天或某几天,这时候就存在两个值,一个是起始值,一个是结束值。

假如我们获取的是今天一整天的数据,那么起始值应当是00:00:00,这个一般不存在异议。但是在结束值的问题上则存在争议了,大多数人认为结束值应该是23:59:59,或者在这个基础上再加上毫秒值。

随便这百度上搜索出相关的答案也大多都认为是23:59:59

答案

这道选择题应该选择的是CD。
C和D其实是一样的,这个我不做解释。
我知道很多人觉得我说得不对,C和D明明是第二天的开始,怎么会是第一天的结束呢?

这句话前半句对了,确实是第二天的开始,但它们也是第一天的结束。

证明

纠结的等式

我们来做个小学数学题:

1 ÷ 3 = 1/3 --------------------- ①
1 ÷ 3 = 0.333… --------------- ②(我以3个连续的“…”表示无限循环,下同)
---------------------已知①式与②式左边相等,同时,右边也相等;
1/3 × 3 = 1 --------------------- ③
0.333… × 3 = 0.999… ------ ④
---------------------那么③式与④式右边相等吗?

这个问题在我初中时第一次遇到,当时的想法自然是认为1与0.999…不等的,但这个推理过程确实无懈可击的,那么问题出在哪里呢?答案就是1与0.999…完全相等。

果壳网的证明

若是不信可以去看2011年果壳网发表的文章最让人纠结的等式:0.999…=1,怀念初次看到这篇文章的岁月。

文章里其实已经说了,上面这个问题本身就是对这个结论的证明。如果不想看枯燥的数学证明,那么看看这篇文章下面的评论也是可以的。
评论

  • 热评第一的意思就是:如果你认为1与0.999…不等,由于数是无穷的,那么1与0.999…之间必然存在一个数,介于两个数之间。但是并没有人能找出这个数,所以这两个数就是相等的。

  • 热评第二就是很多人会说的,两个数之间总差了“1”,我们可以计算一下:

1 - 0.999… = 0.000…
这两个数想减的结果是无穷个0,并没有1出现,所以结果是0,所以两数相等。

那么我们如果要寻找所有0~1之间的数应该是什么样的呢?

(0,1)
即所有大于0小于1的数,等价于(0,0.999…)

结束时间的证明

数学证明

所以,我们要找今天一整天的时间范围就应该是从昨天结束,到明天开始这之间的所有时间。
按照大多数人的想法,应该是00:00:0023:59:59之间,但是由于精度问题,所以更准确的表达应该是00:00:0023:59:59.999…

上面我们已经知道:

1 = 0.999…且(0,1)等价于(0,0.999…)
同样的,23:59:59.999…等价于24:00:00,而24:00:00等价于00:00:00
所以,23:59:59.999…等价于00:00:00
所以,一天的时间范围应该是00:00:00至第二天的00:00:00

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值