Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP文件修改时间使用GMT偏移设置报告正确的时间_Php_Datetime_Timezone_Gmt_Filetime - Fatal编程技术网

PHP文件修改时间使用GMT偏移设置报告正确的时间

PHP文件修改时间使用GMT偏移设置报告正确的时间,php,datetime,timezone,gmt,filetime,Php,Datetime,Timezone,Gmt,Filetime,我目前正在报告文件修改时间,如下所示: $this->newScanData[$key]["modified"] = filemtime($path."/".$file); $modifiedtime = date($date_format." ".$time_format, $this->newScanData[$key]["modified"]); 对我来说,我认为这没有什么错,但是我代码的一个用户报告时间是4小时。我能想到这一点的唯一原因是服务器与用户处于不同的时区。每个用户

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

$this->newScanData[$key]["modified"] = filemtime($path."/".$file);
$modifiedtime = date($date_format." ".$time_format, $this->newScanData[$key]["modified"]);
对我来说,我认为这没有什么错,但是我代码的一个用户报告时间是4小时。我能想到这一点的唯一原因是服务器与用户处于不同的时区。每个用户都有一个变量,我可以使用它来存储用户所在的时区<代码>$gmt\u偏移量存储为基本浮动偏移量

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


如何根据
$gmt\u offset
获取
$modifiedtime
以使用户在其时区内拥有正确的时间?

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

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

gmdate("H:i:s", strtotime($gmt_offset . " hours"));
更多信息请点击此处:

$gmt\u offset应该是float类型,而不是int类型——某些时区可能有分数差,例如阿德莱德的gmt+09:30将根据服务器的时钟返回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

如何存储用户的时区?作为整数偏移量?是的。对不起,忘了提那件事。例如$gmt_offset=-4;你的服务器在GMT时区吗?@Pekka服务器可能在世界上任何地方。所以你也需要服务器时区?但这样行吗?如果服务器在GMT-2,而用户在GMT-4,该怎么办?这个答案是在我澄清您也需要服务器的偏移量之前给出的。所以它不会像那样工作。将编辑答案在哪里输入
filetime()
$timestamp
值?这类似于:
gmdate(“H:I:s”),($timestamp+($gmt\u offset*3600))谢谢,我自己也有同样的代码。现在正在测试。这里你假设服务器是GMT-0?@Brady:不,这里的偏移量是相对于服务器时间的。您可以为服务器时区添加额外的更正(例如,
$server\u offset
)@LazyOne:以及如何检查服务器时间的时区?@XpertEase2:如果您知道服务器位于何处/您在那里设置了哪个时区,那么
$server\u offset
可以硬编码/声明为常量。如果需要动态计算,请查看抱歉的LazyOne,但我不能保证DateTime类在所有服务器上都可用。
<?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