【问题标题】:timestamps not honoured in PHP-FPMPHP-FPM 中不支持时间戳
【发布时间】:2013-08-17 23:31:39
【问题描述】:

我知道这可能是 ServerFault 的问题,但我无法登录。

我在云中有一个运行 Nginx + PHP5-fpm 的 Ubuntu 实例。

我已将 php.ini 中的时区设置为 Asia/Singapore,并验证它是在 phpinfo() 中设置的。

我也使用dpkg-reconfigure tzdata 设置了操作系统时区。

一段时间以来,我一直在为我的申请中设置错误的日期而烦恼。我最初认为这可能是我在 PHP 设置中所做的,所以在我的引导脚本中,我包括:

date_default_timezone_set('Asia/Singapore');

尝试按照本文中的建议通过 PECL 安装 timezonedb: Setting default timezone does not work despite timezone being valid

在网络表单上设置的用户设置日期在处理时仍会转换为“昨天”。我在 PHP 中尝试了 date()gmdate(),结果相同。

编辑

更多信息以防万一。

  1. 用户选择了jQuery DatePicker的日期

  2. 在提交表单时,我将时间戳发送回服务器供 PHP 处理和存储。在存储之前,我在 PHP 中将时间戳除以 1000。

    <?php $timestamp = (int) $_POST['birthday'] / 1000
    // this is received from a form.
    
  3. 在回显日期和时间戳时,

        <?php echo date('dS F Y', (int) $timestamp);
         // when rendering to HTML...
         // computes to 13th April 1981
    
        //JS
        new Date(data.timestamp * 1e3).toString()
        // the exact same timestamp from earlier but received from server.
        // computes to Tue Apr 14 1981 23:30:00 GMT+0730 (SGT)
    

有什么想法吗?

【问题讨论】:

    标签: php ubuntu


    【解决方案1】:

    您的时钟假定为 UTC/GMT,但“人性化”/ 转换为字符串会添加时区偏移量。 GMT 中的 HTTP 标头将使用原始值。这通常是 Unix 时钟的工作方式,它使全局流量路由成为可能。

    <?php
    
    # my locale is configured for London
    var_dump(time(), date('Y-m-d H:i:s'));
    
    date_default_timezone_set('Asia/Singapore');
    var_dump(time(), date('Y-m-d H:i:s')); # MySQL, locale
    var_dump(time(), date('r')); # RFC 2822 
    var_dump(time(), date('c')); # ISO 8601 
    

    您的服务器正在报告正确的 UTC 时间。 要解决这个问题,您能否在 PHP 中发出该标头?这将覆盖第一个值...

    header("Date: ".date('r', time()+8*60*60));
    

    编辑

    当你改变了问题,更多的文字回应......

    我认为有必要确认所有 date-as-int 操作都是使用 UTC/GMT 时间完成的。 如果您的用户在新加坡,时间将以+8h 偏移量发送到服务器。您是作为文本还是整数传输?我使用的所有 jQuery 日期都返回一个字符串。 如果你通过 strtotime() 解包,它会更正时间偏移。

    /1000 应该没有计算意义,8h = (60*60*8)s = 28800s 即 >1000。

    你的客户对时区有什么看法~ gettimezoneoffset

    看起来转换为 int 的操作之一没有删除时区偏移量。

    【讨论】:

    • 感谢您的澄清,我想 HTTP 标头不是问题所在。脚本仍然导致错误的时间设置。我会更新问题
    【解决方案2】:

    在 Ubuntu launchpad 中列出并修补了一个错误。更新 PHP 后时间戳有效。错误摘录:

    [影响]

    Precise 和 Quantal 之间的时区处理回归意味着依赖于系统时区的 PHP 脚本现在改用 UTC。这会破坏任意 PHP 脚本 - 例如。仙人掌按预期停止工作。

    不受影响:5.3.10-1ubuntu3.4(精确) 受影响:5.4.6-1ubuntu1(量子) 不受影响:5.4.4-7 (sid)

    解决方法:编辑 /etc/php5/*/php.ini,取消注释“date.timezone”行并将其设置为您需要的。

    [测试用例]

    1. 使用“dpkg reconfigure tzdata”设置除 UTC 以外的时区。
    2. $ php -r 'echo date_default_timezone_get()."\n";'

    预期结果:系统时区(例如“欧洲/伦敦”)

    实际结果: PHP 警告:date_default_timezone_get():依赖系统的时区设置是不安全的。您需要使用 date.timezone 设置或 date_default_timezone_set() 函数。如果您使用了这些方法中的任何一种,但仍然收到此警告,您很可能拼错了时区标识符。我们现在选择时区“UTC”,但请设置 date.timezone 以选择您的时区。在第 1 行的命令行代码中 世界标准时间

    (在这种情况下,UTC 是系统时区)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 1970-01-01
      相关资源
      最近更新 更多