【问题标题】:How to handle not being able to store time in an int?如何处理无法将时间存储在 int 中?
【发布时间】:2011-05-13 21:06:26
【问题描述】:

在某些语言中,时间存储为从纪元开始的秒数并存储在 int 中(如果我错了,请纠正我)。所以我们最终会遇到一个点,我们不能将当前时间存储在 int 中,因为没有足够的位来保存时间。

现在我知道这是在路上,但是,现在不值得考虑吗?

无论如何,我真正的问题是,我应该始终使用 64 位来存储时间,还是操作系统可能会处理这个问题?

【问题讨论】:

  • 在谈到 Unix 时间时,这有时被称为 2038 problem
  • @amit: 实际上更多的是xkcd.com/607 (also: xkcd.com/376) :)
  • 您可以将分辨率更改为分钟,范围更广。

标签: java c++ c time


【解决方案1】:

如果您想处理相当远的未来日期,您的担忧是有效的。使用无符号 32 位整数,您最多可以存储 2^32 秒,即 136 年多一点。

要回答您的问题,您应该使用 64 位还是 32 位来存储秒数取决于您的应用程序的需要。如果您想存储普通应用程序的日历约会,32 位可能就足够了。另一方面,如果您正在构建时间机器,使用 64 可能是更安全的选择。

这实际上是一个众所周知的问题,类似于千年虫问题。详情请见http://en.wikipedia.org/wiki/Year_2038_problem

【讨论】:

  • 64 位对于一台像样的时间机器来说是不够的,如果您想对宇宙的热寂嗤之以鼻,则需要 512 位。
  • 好吧,您可以使用基本的 64 位时间机器跳到未来 5e11 年,并在那里购买更好的时间机器。到那时价格可能会下降很多。
  • 我刚开始用我的 1 位时间机器来做这件事。不会撒谎,我认为这需要一段时间。
  • - 或者 - 你可以使用浮点数,毕竟当你跳得这么远时,你并不真正关心精度。 :)
【解决方案2】:

现代语言使用 long 数据类型(即 java 和 .net)来存储时间(以毫秒为单位)。

【讨论】:

  • 在 C 语言中,您应该使用 time_t,它在现代系统上是 64 位,即使在 32 位操作系统上也是如此。但在嵌入式中,您的里程可能会有所不同。
【解决方案3】:

当纪元 (1970-01-01 00:00 GMT) 的秒数不再适合 32 位整数时,某些平台/编程语言会遇到问题。这不适用于所有平台或所有编程语言。

如果您使用 64 位整数来计算秒数,那么您可以安全使用很多年。此外,如果您使用这 64 位来计算毫秒数,那么很长一段时间内您仍然可以使用。我完全不希望有任何问题,因为即使您需要九位数字来写年份,您也是安全的。

【讨论】:

  • 使用毫秒已经过时了。这些天纳秒是标准的亚秒时间单位......
猜你喜欢
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 2021-05-29
  • 2018-06-05
  • 2011-05-16
  • 2018-12-10
  • 1970-01-01
  • 2010-09-10
相关资源
最近更新 更多