【问题标题】:Is this a php bug, or is something wrong with my timezone/PHP settings?这是一个 php 错误,还是我的时区/PHP 设置有问题?
【发布时间】:2011-01-16 20:59:58
【问题描述】:

文件的真实完整内容:

<?php

error_reporting(E_ALL);
ini_set(display_errors, 'on');

try {

    //$x = strtotime('blah');
    $x = new DateTime('lol');

} catch ( Exception $e ) {
        echo $e->getMessage();
}

DateTime 构造函数接受一个字符串,如果它不能解析它应该抛出一个异常。这在我的本地机器上运行良好,但在我的一台远程服务器上没有捕获到异常(再次,我 am 使用 try/catch 和 SAME EXACT 代码):

致命错误:未捕获的异常 带有消息的“异常” 'DateTime::__construct() [function.DateTime---construct]: 无法解析时间字符串 (lol) 位置 0 (l):时区不能 可以在数据库中找到 /var/www/html/site_com/rez/date.php:9 堆栈跟踪:#0 /var/www/html/site_com/rez/date.php(9): DateTime->__construct('lol') #1 {main} 投入 /var/www/html/site_com/rez/date.php 上 第 9 行

未捕获异常的远程服务器设置:

PHP 版本 5.2.5

启用日期日期/时间支持 “奥尔森”时区数据库版本 2007.9 时区数据库内部默认时区美国/芝加哥

指令本地值主值 date.default_latitude 31.7667 31.7667 date.default_longitude 35.2333 35.2333 date.sunrise_zenith 90.583333 90.583333 date.sunset_zenith 90.583333 90.583333 date.timezone 无值 无值

我的本​​地设置在哪里工作:

PHP 5.2.10

启用日期日期/时间支持 “奥尔森”时区数据库版本 0.system Timezone Database internal Default timezone System/Localtime

指令本地值主值 date.default_latitude 31.7667 31.7667 date.default_longitude 35.2333 35.2333 date.sunrise_zenith 90.583333 90.583333 date.sunset_zenith 90.583333 90.583333 date.timezone 无值 无值

在本地,它捕获异常并将错误打印出来。两者上的date.timezone 都没有价值。

也许只是我内部系统的时区关闭了?我的本地机器是 Ubuntu,我的远程机器是 CentOS,它们可能不一致,但 PHP 不应该仍然捕获异常吗?

仅供参考,因为我没有管理员权限,所以无法在远程机器上更新 PHP。

【问题讨论】:

    标签: php datetime exception-handling timezone


    【解决方案1】:

    我赌的是一个 PHP 错误。我知道 PHP 曾经在捕获构造函数中抛出的异常时遇到问题,这似乎就是这里发生的事情。

    因为这是一个错误,你的选择是

    1. 更新服务器的PHP版本;你说这不是一个选择
    2. 使用strtotime() 查找日期,或者,如果您需要或想要访问DateTime 的面向对象样式,请使用strtotime() 捕获错误

    例如:

    <?php
    
    try {
    
        if (@strtotime($str) !== false) {
            $x = new DateTime($str);
        } else {
            throw new Exception("Failed to parse string ({$str})");
        }
    
    } catch ( Exception $e ) {
        echo $e->getMessage();
    }
    

    【讨论】:

    • 你甚至可以尝试扩展 DateTime 类,并用上面的代码覆盖构造函数,除了你将使用 parent::__construct() 而不是 new DateTime。请记住,原型必须相同,因此您的构造应该采用两个参数(字符串 $str,DateTimeZone $timezone = null)。这具有确定 __construct() 无法捕获的异常错误是否是问题的根源的额外好处。
    • 是的,我目前正在使用 strtotime 并确保它不会失败,然后将其提供给 DateTime 构造函数 - 我会尝试扩展。
    • 可以在 PHP 5.5.9ubuntu 中重现这个。
    【解决方案2】:

    不确定确切的问题,但尝试使用此功能设置时区:

    date_default_timezone_set('Europe/London'); // or whatever timezone
    

    看看这是否有效。

    【讨论】:

    • 未捕获异常的服务器已经有一组(默认时区美国/芝加哥)。
    • 是的,我之前已经尝试过了,但它似乎没有任何作用。
    • 那么这是一个奇怪的问题,让我们看看有什么解决办法呢
    【解决方案3】:

    我遇到了类似的问题,可以用

    解决
    date('date format', $str);
    date("Y-m-d", $news->created);
    

    希望对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多