PHP中的UTC偏移量

PHP中的UTC偏移量,php,timezone,utc,Php,Timezone,Utc,在PHP中,相对于当前(系统)时区,获取UTC偏移量的最简单方法是什么? 未经测试,但应该有效 date('Z'); 以秒为单位返回UTC偏移量。date(“Z”)将返回相对于服务器时区而不是用户机器时区的UTC偏移量。要获取用户的机器时区,可以使用javascriptgetTimezoneOffset()函数,该函数返回UTC时间和本地时间之间的时差,单位为分钟 <script type="text/javascript"> d = new Date(); w

在PHP中,相对于当前(系统)时区,获取UTC偏移量的最简单方法是什么?

未经测试,但应该有效

  date('Z');
以秒为单位返回UTC偏移量。

date(“Z”)
将返回相对于服务器时区而不是用户机器时区的UTC偏移量。要获取用户的机器时区,可以使用javascript
getTimezoneOffset()
函数,该函数返回UTC时间和本地时间之间的时差,单位为分钟

<script type="text/javascript">
    d = new Date();
    window.location.href = "page.php?offset=" + d.getTimezoneOffset();
</script>

d=新日期();
window.location.href=“page.php?offset=“+d.getTimezoneOffset();

在保存php代码的
page.php
中,可以使用该偏移值执行任何操作。或者,您可以根据需要通过Ajax将偏移量值发送到php脚本,而不是重定向到另一个页面。

我对Oscar做了一个稍微修改的版本

date_default_timezone_set('America/New_York');
$utc_offset =  date('Z') / 3600;
这给了我从时区EST到UTC的偏移量,单位为小时


$utc_offset的值为-4。

这是相同的JavaScript
日期。getTimezoneOffset()
函数:

// will output something like +02:00 or -04:00
echo date('P');
<?php
echo date('Z')/-60;
?>

您只需执行以下操作:

//Object oriented style
function getUTCOffset_OOP($timezone)
{
    $current   = timezone_open($timezone);
    $utcTime  = new \DateTime('now', new \DateTimeZone('UTC'));
    $offsetInSecs =  $current->getOffset($utcTime);
    $hoursAndSec = gmdate('H:i', abs($offsetInSecs));
    return stripos($offsetInSecs, '-') === false ? "+{$hoursAndSec}" : "-{$hoursAndSec}";
}

//Procedural style
function getUTCOffset($timezone)
{
    $current   = timezone_open($timezone);
    $utcTime  = new \DateTime('now', new \DateTimeZone('UTC'));
    $offsetInSecs =  timezone_offset_get( $current, $utcTime);
    $hoursAndSec = gmdate('H:i', abs($offsetInSecs));
    return stripos($offsetInSecs, '-') === false ? "+{$hoursAndSec}" : "-{$hoursAndSec}";
}


$timezone = 'America/Mexico_City';

echo "Procedural style<br>";
echo getUTCOffset($timezone); //-06:00
echo "<br>";
echo "(UTC " . getUTCOffset($timezone) . ") " . $timezone; // (UTC -06:00) America/Mexico_City
echo "<br>--------------<br>";
echo "Object oriented style<br>";
echo getUTCOffset_OOP($timezone); //-06:00
echo "<br>";
echo "(UTC " . getUTCOffset_OOP($timezone) . ") " . $timezone; // (UTC -06:00) America/Mexico_City
//面向对象风格
函数getUTCOffset\u OOP($timezone)
{
$current=时区\打开($timezone);
$utcTime=new\DateTime('now',new\DateTimeZone('UTC');
$offsetInSecs=$current->getOffset($utcTime);
$hoursAndSec=gmdate('H:i',abs($offsetInSecs));
返回stripos($offsetInSecs,“-”)==false?+{$hoursAndSec}:“-{$hoursAndSec}”;
}
//程序风格
函数getUTCOffset($timezone)
{
$current=时区\打开($timezone);
$utcTime=new\DateTime('now',new\DateTimeZone('UTC');
$offsetInSecs=时区\u offset\u get($current,$utcTime);
$hoursAndSec=gmdate('H:i',abs($offsetInSecs));
返回stripos($offsetInSecs,“-”)==false?+{$hoursAndSec}:“-{$hoursAndSec}”;
}
$timezone='美国/墨西哥城';
呼应“程序风格
”; echo getUTCOffset($timezone)//-06:00 回声“
”; echo“(UTC.getUTCOffset($timezone)。”)$时区;//(UTC-06:00)美国/墨西哥城 回声“
--------------
”; 呼应“面向对象风格
”; echo getUTCOffset_OOP($timezone)//-06:00 回声“
”; echo“(UTC.getUTCOffset_OOP($timezone)。”)$时区;//(UTC-06:00)美国/墨西哥城
在PHP5中使用DateTime类时非常有用。但我不是,谢谢。不幸的是,PHP要求调用date\u default\u timezone\u set()。如果将其设置为GMT,则数据库中的日期仍为本地时间,但date('Z')将返回零。如果您将其设置为服务器的时区,您也可以在include文件中硬编码服务器相对于GMT的偏移量。令人难以置信的是,没有直接的方法可以做到这一点。编辑:我发现您可以执行日期\默认值\时区\设置(日期\默认值\时区\获取()。多么愚蠢!date('Z')以秒为单位返回GMT偏移量,该偏移量返回0。Adry,看起来您是在UTC(-;OP明确询问“相对于当前(系统)时区?”OP询问PHP解决方案,而不是JSIt。它与OP询问的内容无关,但对于“来自外部”的人无论如何,这是一个有用的点,«时区偏移量(以秒为单位)。»减号应该保留…除以
60
。而不是除以
-60
,然后,这将输出服务器的时区偏移量。OP希望(在2008年)将本地用户的偏移量与您谈论的值进行比较。@LouySpatriceBesette
getTimezoneOffset()
函数在javascript中给出的值正好是(-180)。这对…来说是正确的,它以分钟而不是秒为单位。PHP date不会进行绝对值反转。我会说
四舍五入(日期('Z')/-60,2);
(十进制精度)适用于UTC+8:45这样的时区偏移量,比如澳大利亚的西特拉尔西部。;)我把。。。但更多的解释会更好。。。这是你的答案。只是让你知道。。。我已经把你的答案放在“迟交答案”的审查队列上了。此处对问题和答案进行了严格审查;)你的答案越完整、越相关,你获得的代表性就越多。;)对于OOP样式:
timezone\u open
是的别名。
//Object oriented style
function getUTCOffset_OOP($timezone)
{
    $current   = timezone_open($timezone);
    $utcTime  = new \DateTime('now', new \DateTimeZone('UTC'));
    $offsetInSecs =  $current->getOffset($utcTime);
    $hoursAndSec = gmdate('H:i', abs($offsetInSecs));
    return stripos($offsetInSecs, '-') === false ? "+{$hoursAndSec}" : "-{$hoursAndSec}";
}

//Procedural style
function getUTCOffset($timezone)
{
    $current   = timezone_open($timezone);
    $utcTime  = new \DateTime('now', new \DateTimeZone('UTC'));
    $offsetInSecs =  timezone_offset_get( $current, $utcTime);
    $hoursAndSec = gmdate('H:i', abs($offsetInSecs));
    return stripos($offsetInSecs, '-') === false ? "+{$hoursAndSec}" : "-{$hoursAndSec}";
}


$timezone = 'America/Mexico_City';

echo "Procedural style<br>";
echo getUTCOffset($timezone); //-06:00
echo "<br>";
echo "(UTC " . getUTCOffset($timezone) . ") " . $timezone; // (UTC -06:00) America/Mexico_City
echo "<br>--------------<br>";
echo "Object oriented style<br>";
echo getUTCOffset_OOP($timezone); //-06:00
echo "<br>";
echo "(UTC " . getUTCOffset_OOP($timezone) . ") " . $timezone; // (UTC -06:00) America/Mexico_City