16

我的理解是,由于 PHP 使用毫秒表示日期的性质,您不能表示 2038 年之后的日期。我有一个问题,我想计算很远的将来的日期。几千年后。

显然,由于限制,我不能使用 php date 函数来表示这个日期,但是,我有一些东西在我身边……我想做的就是存储年、月和日。我不关心小时、分钟、秒和毫秒。

我是否正确地认为,如果不包括这些额外的信息,我应该能够在未来进行更远的计算,因为我愿意丢弃很多信息。这是当前执行此操作的任何库吗?如果没有,对如何解决这个问题有任何建议吗?

4

5 回答 5

26

您也可以使用DateTime该类,它在内部独立地表示时间组件。因此它不受 2038 限制的影响(除非您使用 ::getTimestamp)。

于 2011-03-16T00:43:35.900 回答
8

可以使用 64 位平台。

整数的大小取决于平台,尽管通常值约为 20 亿的最大值(即 32 位有符号)。64 位平台的最大值通常约为 9E18。

来源

找出您的平台是 64 位的var_dump(PHP_INT_SIZE === 8)。如果TRUE,您的系统是 64 位的。

于 2011-03-16T00:44:12.600 回答
2

PHP 在 5.2 版本中引入了Datetime()类来解决这个问题。但是您仍然必须使用 64 位操作系统。

于 2011-03-16T00:42:59.013 回答
1

您是正确的,因为 PHP 不允许您本地处理 > 2038 的日期。然而,像这个库这样的库利用了浮点是 64 位这一事实,因此如果需要,您可以绕过这个问题。(所有假设您使用的是 32 位系统......如果您使用的是 64 位,那么您很好)。

于 2011-03-16T00:38:00.077 回答
0

忘记窗户!即使您在 Windows 64 位上运行 Apache 64 位!

$timestamp = strtotime('22-09-2508');
var_dump ($timestamp);
// returns bool false using WAMP 64-Bit over Windows 64 Bit

如果需要计算时间戳,请使用 64 位系统(不是 Windows):

$timestamp = strtotime('22-09-2508');
var_dump ($timestamp);
// returns int 17000496000 using a LAMP Server

您可以在 Windows 上使用 VMWare 运行 LAMP 服务器,并且很可能您的最终主机服务器也将使用此 64 位服务。

换句话说:

if (intval("9223372036854775807")==9223372036854775807) {
  // 64-bit
} else {
  // 32-bit
}

知道了 ?

注意: time() 和 getTimestamp() 在 2038 年后都可以在 64 位环境(linux)中正常工作。

于 2014-06-30T06:24:43.693 回答