【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

更多精彩推荐
☞开发者抢茅台软件霸榜GitHub后;双十一“套路”多,京东天猫唯品会被罚;4MLinux新版发布|极客头条
☞云计算正在“抹杀”开源?

☞做开源 18 年,他想把中国开源带向世界 | 人物志

☞小众却顽强的编程语言 Erlang ,你了解多少?

☞告别 Windows、Android,国产操作系统合力破局

☞Windows 游戏之父 Eric Engstrom 意外去世,享年55岁

点分享点收藏点点赞点在看
Logo

20年前,《新程序员》创刊时,我们的心愿是全面关注程序员成长,中国将拥有新一代世界级的程序员。20年后的今天,我们有了新的使命:助力中国IT技术人成长,成就一亿技术人!

更多推荐