【问题标题】:64-bit php timestamp issue64位php时间戳问题
【发布时间】:2011-01-01 08:47:20
【问题描述】:

需要能够使用超过 32 位时间戳限制的日期,因此将我们的服务器升级到 Windows Server 2003 64 位版本。并运行 php 5.2.5 64 位。但是仍然不能使用超过 32 位限制的日期。

echo strtotime("11-11-2050");

什么都不返回。

使用 C:\WINDOWS\system32\inetsrv\fcgiext.dll 在 IIS 6.0 上运行 php

如果我遗漏了什么,请告诉我。找到了 Adodb 日期库,它可以满足我的需要,但我更喜欢使用本机 php 函数,所以如果可能的话,我不必修改现有代码。

有人知道这是否可以在 Windows Server 2003 64 位上运行?

谢谢

【问题讨论】:

  • 把日期的顺序改为“2050-11-11”会有什么结果?

标签: php iis-6 64-bit windows-server-2003 timestamp


【解决方案1】:

PHP 尚未在 Win32 上使用 64 位 time_t。

【讨论】:

  • OP 说“...所以将我们的服务器升级到 Windows Server 2003 64-bit 版本...”
  • 不会改变 PHP 编译为使用 32 位 time_t 的事实 - 操作系统不会确定这一点,它是编译时确定的,PHP 使用 32 位值这个。
  • 这是我们下载安装的php版本。 fusionxlan.com/PHPx64.php 它运行在 IIS6.0 上的 64 位 Windows Server 2003 上。我们有什么选择可以让这项工作正常进行吗?
  • 只有一个:编译你自己的 64 位版本的 PHP。
【解决方案2】:

我刚刚在 32 位机器上尝试过,结果返回 false 与 var_dump:

var_dump strtotime("11-11-2050");

echo 不返回任何内容,因为 false 是不可显示的。我注意到http://php.net/manual/en/function.strtotime.php上的php Changelog

5.1.0 现在在失败时返回 FALSE,而不是 -1。

该页面底部还有一条说明:

注意:时间戳的有效范围通常是从 1901 年 12 月 13 日星期五 20:45:54 UTC 到 2038 年 1 月 19 日星期二 03:14:07 UTC。 (这些日期对应于 32 位有符号整数的最小值和最大值。)此外,并非所有平台都支持负时间戳,因此您的日期范围可能会限制为不早于 Unix 纪元。这意味着例如1970 年 1 月 1 日之前的日期不适用于 Windows、一些 Linux 发行版和一些其他操作系统。 PHP 5.1.0 和更新的版本克服了这个限制。

所以我认为即使是 64 位版本的 Windows 也可能在 php 中使用 32 位整数。你安装了64位版本的php吗?

phpinfo() 应该能够显示 System 行下正在运行的 php 版本。

【讨论】:

  • 即使是 64 位版本的 PHP 在 Windows 上仍然使用 32 位 time_t,所以这不会有太大帮助 - 但是,对于您提出的问题,更简单的测试是拥有它们var_dump(PHP_INT_MAX);
  • 这里有一个 64 位版本的 php:fusionxlan.com/PHPx64.php 看了下 php.net 的主网站,我不认为他们正式支持 64 位 php atm。
【解决方案3】:

据称该问题已在 2008 年得到修复,如错误 #44209 所示。

derick@php.net 说,

此错误已在 CVS 中修复。

源快照每三个小时打包一次;这种变化 将在下一个快照中。您可以在以下位置获取快照 http://snaps.php.net/.

感谢您的报告,感谢您帮助我们改进 PHP。

【讨论】:

  • 是的,它已经修复了 - 但是,PHP (fusionxlan.com/PHPx64.php) 的唯一“64 位 Windows”分发版使用的是在修复之前几乎一年就存在的源代码树。
  • 这是我们从 fusionxlan 使用的版本。我们可以做些什么来更新该版本以支持 64 位时间戳?
【解决方案4】:

使用 DateTime 类,因为它适用于 32 位和 64 位,并且内置于 php5x 中

http://us.php.net/manual/en/class.datetime.php

<?php

$dateTime = new DateTime("+200 years");


echo $dateTime->format("Y-m-d H:i:s");

?>

【讨论】:

  • 尽管从表面上看,这可能看起来是个坏建议(您可能不得不重写相当多的代码),但实际上这是一个非常好的建议,我可能应该想到.干得好,女士。
  • 不错..这对我很有用。我将不得不更新我的代码,我对此并不感到兴奋,但至少它是核心功能。
  • 这样做:添加这个函数
    function adodb_strtotime($str) { $dateTime = new DateTime($str);返回 $dateTime->format("U"); } 然后使用这个库:phplens.com/phpeverywhere/adodb_date_library 那么这将最大限度地减少你的重写,只在日期函数前面添加 adodb
【解决方案5】:

尽量减少代码重写:

<?php    
function adodb_strtotime($str) {
   $dateTime = new DateTime($str);
    return $dateTime->format("U");
}
?>

然后添加这个类: http://phplens.com/phpeverywhere/adodb_date_library

然后只需在所有正常日期函数前面添加 adodb_。例如 mktime 将是 adodb_mktime

日期将是 adodb_date

strtotime 将是 adodb_strtotime...你明白了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-16
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    相关资源
    最近更新 更多