iPhone 的倒计时竟然会显示假时间?

图片

【CSDN 编者按】你会怀疑手机的倒计时时间不准吗?一名开发者在他的倒计时应用中发现,iPhone的倒计时并没有严格的显示正确的时间,而研究下来发现,这样可以方便人们更直观地读取时间。

英文:Why the iPhone Timer App displays a Fake Time
原文链接:https://lukashermann.dev/writing/why-the-iphone-timer-displays-fake-time/
作者:Lukas Hermann,全栈开发,主要从事前端、Vue.js以及用户界面设计。
本文为 CSDN 翻译,转载请注明来源出处。

作者 | Lukas Hermann  已获作者翻译授权
译者 | 弯月  责编 | 丁恩华
出品 | CSDN(ID:CSDNnews)

一天,在构建我的事件倒计时应用(https://stagetimer.io/)时,我遇到了一个特殊的有关显示时间的问题,而且我发现iPhone的倒计时应用会显示假时间。按理说,倒计时应该显示剩余的时间,所以,如果倒数计时显示5秒,我们就会理解为还剩5秒。然而,实际情况并非如此。

图片

简单来说,iPhone的倒计时应用没有严格地显示正确的时间,它显示的剩余时间多了500毫秒(半秒)。这样做是为了方便人类更直观地读取时间。另外,倒计时结束时的闹铃不受此500毫秒的影响。

倒计时并不简单

JavaScript喜欢在处理时间时使用毫秒,1000毫秒=1秒。如下是一个5秒的倒计时,从5000毫秒开始,我们使用setInterval()函数每过10毫秒就减去10 毫秒,非常简单。将毫秒转换为秒需要除以1000,然后向下舍入:Math.floor(milliseconds / 1000)

图片

点击开始,倒计时会立即跳到4s,当倒计时显示0s的时候,实际上还剩1秒。对于正向计时,这种做法很符合常理,例如,上午10点的第一分钟显示10:00,而不是10:01,总是向下舍入。然而,对于倒计时来说,这有点违反直觉。如果倒计时带有小数的话,更容易理解。

图片

现在,在最后1秒钟,计时器显示的是0.9s,而不是0s,所以你很清楚还有剩余时间。然而,我不想在我的事件倒计时应用中显示小数。

iPhone的工作方式

我很好奇iPhone如何解决这个难题。因此,我将iPhone的倒计时设置为5秒:

图片

单击“开始”后,iPhone的倒计时显示5s,而不是上面示例中的4s。但是,它会在接近1秒钟(但未到1秒)的时候切换成4s。接下来,它会正常数秒,一直到0s,又一次在真正到达0秒之前显示了0s。而且,如果你在它显示0s之前点击“暂停”,它会立即跳回到1s,目的是为了告诉你还有一些剩余时间。

我认为,苹果公司的开发人员在实际的时间上加了500毫秒的“假时间”,所以倒计时是从5s开始显示的,而不是4s。当实际剩余时间为0秒,而“假时间”还剩500毫秒时,倒计时结束,手机闹铃响起。看来他们遇到了相同的问题,并提出了一个切实可行的解决方案。毕竟,5秒的倒计时应该从5s开始,对吧?为了举例说明,我利用相同的技巧做了一个简单的倒计时:

图片

故事到此就结束了,从技术上来说,iPhone的倒计时确实在“撒谎”。

补充:关于时间的舍入

有些人指出,这个问题还有一个更轻松的解决方式:在计算秒数的时候不应该采用向下舍入,而是应该四舍五入或向上舍入。他们说的很对。假设我们需要将 5459543ms 转换为传统形式 HH:mm:ss。

首先,我借助一些模块化的算法将数字转化成小时、分钟和秒,然后再处理小数部分。向下舍入得到的结果是01:30:59,这个结果是正确的;但是四舍五入或向上舍入得到的结果是02:31:60,这个结果显然不正确。

time = 5459543
seconds = (time / 1000) % 60       // 1.517
minutes = (time / 60000) % 60     // 30.992
hours = (time / 3600000) % 24    // 59.543

 

然而,首先将时间转换成5460000ms,然后再拆分成小时、分钟和秒,则产生的结果与上述加500毫秒相同,即01:31:00。

time = 5460000
seconds = (time / 1000) % 60// 0.000
minutes = (time / 60000) % 60// 31.000
hours = (time / 3600000) % 24// 1.517

图片

关注“高校俱乐部”,更多精彩等着你~👇 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值