python - 在Python中测量短间隔最安全、最可靠的方法? (跨平台、跨硬件、抗夏令时、闰秒)

标签 python datetime time dst leap-second

我对日期时间算术了解得越多,我就越头疼。

时间有很多种:

  • 民用时间
  • 世界标准时间
  • 泰伊
  • UNIX 时间
  • 系统时间
  • 线程时间
  • CPU 时间

然后时钟可以运行得更快或更慢或者向后或向前跳跃,因为

  • 夏令时
  • 跨时区移动
  • 闰秒
  • NTP同步
  • 广义相对论

如何处理这些问题又取决于:

  • 操作系统
  • 硬件
  • 编程语言

那么,有人可以告诉我,对于我的具体用例,测量短间隔的最安全、最可靠方法是什么?这是我正在做的事情:

我正在使用 Python (3.7.x) 制作一个游戏,我需要跟踪自某些事件以来已经过去了多长时间。例如,玩家按住按钮的时间有多长,或者敌人发现玩家的时间有多长,或者关卡加载的时间有多长。时间刻度应该精确到毫秒(纳秒就太过分了)。

以下是我希望确保避免的情况:

  • 您在深夜玩游戏。在您所在的时区,当晚,夏令时凌晨 2 点时钟向前拨动一小时,因此分钟为:1:58、1:59、2:00、3:01、3:02。游戏中每个与时间相关的变量都会突然增加一个小时——它认为你按住该按钮一小时零两秒,而不是仅仅两秒。灾难随之而来。

  • 相同,但 IERS 决定在当天的某个时间插入或减去闰秒。您玩完过渡后,所有时间变量都会增加或减少额外的一秒。灾难随之而来。

  • 您在火车或飞机上玩游戏,当您跨越时区边界和/或国际日期变更线时,灾难就会随之而来。

  • 在上述情况下,游戏在某些硬件和操作系统上可以正常运行,但在其他硬件和操作系统上则不能。 IE。它在 Linux 上会崩溃,但在 Window 上不会,反之亦然。

而且我无法真正为这些编写测试,因为有问题的事件很少出现。我需要第一次就做对。那么,我需要使用什么与时间相关的功能呢?我知道有简单的旧 time.time(),但也有一系列令人眼花缭乱的其他选项,例如

  • time.clock()
  • time.perf_counter()
  • time.process_time()
  • time.monotonic()
  • 然后是上述所有内容的纳秒变体。

通过阅读文档,似乎time.monotonic()是我想要的。但如果说阅读有关计时的所有细节教会了我什么的话,那就是这些事情从来都不像它们看上去的那样。曾几何时,我以为我知道什么是“秒”。现在我不太确定了。

那么,如何确保我的游戏时钟正常工作?

最佳答案

specification of time module是查找有关这些内容的详细信息的最佳位置。

在那里,您可以轻松地看到:

  • time.clock() 已弃用,应替换为其他函数
  • time.process_time() 仅计算进程所花费的 CPU 时间,因此它不适合测量挂钟时间(这正是您所需要的)
  • time.perf_counter()time.process_time() 具有相同的问题
  • time.time() 差不多正确,但如果用户修改当前时间,它会给出错误的计时
  • time.monotonic() - 这似乎是测量时间间隔的最安全选择 - 请注意,这根本不会给你当前时间,但它会给你两个时间之间的正确差异点

至于纳秒版本,只有在需要纳秒时才应该使用它们。

关于python - 在Python中测量短间隔最安全、最可靠的方法? (跨平台、跨硬件、抗夏令时、闰秒),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57645403/

相关文章:

python - Pandas 按优先级连接/合并两个数据帧

c# - 如何在 C# 中连接整数和字符串?

android - 格式化从 ExifInterface.TAG_DATETIME 获取的时间和日期

计算 C 中两个 ISO 8601 日期(包括毫秒)之间的差异

r - 如何在 R 中将时间数据拆分为时间间隔?

python - 函数调用后记住数组值

python -\n 在 python 中的工作

python - 何时在 Python 中内联元类的定义?

java - SimpleDateFormat - 解析日期时出现奇怪的结果

Javascript 时间不会打印出来(date.js)