使用时区偏移PHP

时间:2013-07-13 03:49:48

标签: php mysql date timezone offset

我的注册页面上有JavaScript代码,它们在登录时获取时区偏移量,并将其设置为数据库中的时区偏移量变量,看起来像"-06:00,1"。如果观察到夏令时,则设置为1。

我的数据库设置为英国时间或GMT +0:00,我需要从数据库中抽出时间并使用用户的时区偏移来获得正确的时区。

我试过了:

$timeSent = date('H:i:s', strtotime($servertime)+($tzoneOffset)

上述代码有效,但前提是时区是正偏移量,例如06:00。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

一个简单的if-then可以解决这个问题。

if UserTimeZone < 0
    userTime = serverTime - UserTimeZone

else 
    userTime = serverTime + UserTimeZone

答案 1 :(得分:0)

不要那样存放。除了启用/禁用之外,DST还有

PHP完全支持IANA时区。请改用它们。

例如,使用Europe/LondonAmerica/Los_Angeles

你不能只说DST启用/禁用,因为有很多时区对DST何时生效有不同的规则,以及它们的偏移量。没有世界范围的标准。

您需要注意以下几点:

  • 英国并不总是在GMT +0:00。在夏季,英国夏令时(BST)生效,即+1:00。将数据库服务器设置为UTC更合适 - 这与GMT基本相同,并且永远不会更改偏移量。

  • 您说您正在通过JavaScript收集用户的时区偏差。虽然这是可能的,但这不是一个好习惯。执行此操作时,您只捕获当前应用的偏移量。您应该考虑让您的用户从a drop-down list或使用基于地图的时区选择器such as this one选择他们的时区。您可以考虑使用jsTimeZoneDetect来猜测列表的默认值,但不要仅依赖它。您的用户应该能够更改它。

  • 永远永远询问用户是否需要DST。大多数最终用户对其时区规则毫无头绪。让PHP处理您的DST问题。

如果您还没有,请查看time zone tag wiki。那里有很多很好的信息。

答案 2 :(得分:0)

假设您的数据库时间是UNIX时间戳值(或者可能是),您可以使用这样的函数将偏移分开并将秒(+或 - )添加到dbtime:

function adjustTime($dbtime, $offset) {
    $hm = explode(":", $offset);
    $dl = explode(",", $hm[1]);

    $newtime = $dbtime + (intval($hm[0])*3600) + ($dl[1]*3600);

    return $newtime;
}

还假设如果不应用,您的夏令时将为零。