3

我目前正在报告文件修改时间,如下所示:

$this->newScanData[$key]["modified"] = filemtime($path."/".$file);
$modifiedtime = date($date_format." ".$time_format, $this->newScanData[$key]["modified"]);

对我来说,我认为这并没有什么问题,但是我的代码的用户报告说时间已经过了 4 个小时。我能想到这一点的唯一原因是服务器与用户处于不同的时区。每个用户都有一个我可以使用的变量$gmt_offset来存储用户所在的时区。$gmt_offset存储为基本浮点偏移量。

服务器可以在任何时区,不一定在 GMT-0。服务器可能与用户不在同一时区。

如何$modifiedtime根据用户在他的时区获得正确的时间$gmt_offset

4

3 回答 3

2

filemtime()将根据服务器的时钟返回一个 unix 时间戳。由于您有用户到 GMT 偏移可用,您必须将 unix 时间戳转换为 GMT,然后转换为用户的 timszone,如下所示:

<?php
    list($temp_hh, $temp_mm) = explode(':', date('P'));
    $gmt_offset_server = $temp_hh + $temp_mm / 60;
    $gmt_offset_user   = -7.0;
    $timestamp         = filemtime(__FILE__);
    echo sprintf('
        Time based on server time.........: %s
        Time converted to GMT.............: %s
        Time converted to user timezone...: %s
        Auto calculated server timezone...: %s
        ',
        date('Y-m-d h:i:s A', $timestamp),
        date('Y-m-d h:i:s A', $timestamp - $gmt_offset_server * 3600),
        date('Y-m-d h:i:s A', $timestamp - $gmt_offset_server * 3600 + $gmt_offset_user * 3600),
        $gmt_offset_server
    );

    // Output based on server timezone = PKT (+05:00 GMT) and user timezone = PDT (-07:00 GMT)
    // Time based on server time.........: 2011-06-09 03:54:38 PM
    // Time converted to GMT.............: 2011-06-09 10:54:38 AM
    // Time converted to user timezone...: 2011-06-09 03:54:38 AM
    // Auto calculated server timezone...: 5
于 2011-06-09T09:55:13.017 回答
1

您需要的是strtotime()功能。将日期更改为 gmdate,将您的服务器时间转换为 GMT

例如,如果您需要像 10:00:00 这样的时间格式

gmdate("H:i:s", strtotime($gmt_offset . " hours"));

更多信息在这里:

http://php.net/manual/en/function.strtotime.php

http://php.net/manual/en/function.gmdate.php

于 2011-06-09T09:47:16.443 回答
1
$modifiedtime = date($date_format." ".$time_format, $this->newScanData[$key]["modified"] + ($gmt_offset * 3600));

$gmt_offset 应该是 float 类型,而不是 int - 某些时区可能有小数差异,例如阿德莱德的 GMT +09:30

于 2011-06-09T09:54:20.583 回答