为什么 strtotime() 在不同服务器上的工作方式不同?

发布于 2024-12-08 02:36:08 字数 568 浏览 0 评论 0原文

<?php

header('Content-Type: text/plain');

$time = '0000-00-00 00:00:00';
echo $time . PHP_EOL . PHP_EOL;

$time = strtotime($time);
echo $time . PHP_EOL . PHP_EOL;

在我们的开发服务器上,第二个 $time 不输出任何内容。使用 var_dump() 进行的测试显示其值为 false。这很好。在实时服务器上,我得到 943920000。使用 var_dump() 进行的测试表明这是一个整数。

为什么?

显然 日期 0 出现为 30 是相当常见的1999 年 11 月。为什么?为什么在某些服务器上而不是在其他服务器上?

<?php

header('Content-Type: text/plain');

$time = '0000-00-00 00:00:00';
echo $time . PHP_EOL . PHP_EOL;

$time = strtotime($time);
echo $time . PHP_EOL . PHP_EOL;

On our development server, the second $time outputs nothing. A test with var_dump() reveals its value to be false. Which is fine. On a live server, I get 943920000. A test with var_dump() shows that this is an integer.

Why?

Apparently it is fairly common for dates of zero to come up as 30 November 1999. Why? And why on some servers and not on others?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

寂寞陪衬 2024-12-15 02:36:08

尝试

setlocale(LC_ALL, "C");

在任何 strtotime 调用之前

try

setlocale(LC_ALL, "C");

before any strtotime call

喜你已久 2024-12-15 02:36:08

阅读 strtotime() 的 PHP 手册页,我们得到以下结果:

成功时返回时间戳,否则返回 FALSE。

因此,在您的一台服务器上,对 strtotime() 的调用失败。

那么为什么会失败呢?答案也在同一手册页上:

错误/异常

如果时区无效,每次调用日期/时间函数都会生成 E_NOTICE,和/或如果使用系统设置或 TZ 环境变量,则会生成 E_STRICT 或 E_WARNING 消息。另请参见 date_default_timezone_set()

所以在我看来,您的一台服务器没有正确配置其时区区域设置。

综上所述,如果可能的话,我建议不要使用 strtotime() 来做这样的事情。这是一个有点笨重的旧函数,而较新的 PHP 日期时间库 提供更好/更干净的功能。您可以使用它创建一个日期时间对象,如下所示:

$date = new DateTime('0000-00-00 00:00:00');

希望有帮助。

Reading the PHP Manual page for strtotime(), we get the following:

Returns a timestamp on success, FALSE otherwise.

Therefore it follows that on one of your servers, the call to strtotime() is failing.

So why would it fail? The answer to that is also on the same manual page:

Errors/Exceptions

Every call to a date/time function will generate a E_NOTICE if the time zone is not valid, and/or a E_STRICT or E_WARNING message if using the system settings or the TZ environment variable. See also date_default_timezone_set()

So it seems to me that your one server doesn't have it's timezone locale configured correctly.

All that said and done, I would suggest not using strtotime() for stuff like this, if possible. It is a bit of a clunky old function, and the newer PHP datetime library provides much better/cleaner functionality. You can create a datetime object using it as follows:

$date = new DateTime('0000-00-00 00:00:00');

hope that helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文