使用时区偏移PHP



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

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

我试过:

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

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

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

if UserTimeZone < 0
    userTime = serverTime - UserTimeZone
else 
    userTime = serverTime + UserTimeZone

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

function adjustTime($dbtime, $offset) {
    $hm = explode(":", $offset);
    $dl = explode(",", $hm[1]);
    $newtime = $dbtime + (intval($hm[0])*3600) + ($dl[1]*3600);
    return $newtime;
}

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

不要以这种方式存储它们。DST不仅仅是启用/禁用,还有很多。

PHP完全支持IANA时区。请使用这些。

例如,使用Europe/LondonAmerica/Los_Angeles

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

您还需要注意以下几点:

  • 英国并不总是在格林尼治标准时间+0:00。夏季,英国夏令时(BST)生效,即+1:00。将数据库服务器设置为UTC更为合适,UTC与GMT基本相同,并且从不更改偏移量。

  • 您说您正在通过JavaScript收集用户的时区偏移量。虽然这是可能的,但这不是一个好的做法。执行此操作时,仅捕获当前应用的偏移。相反,您应该考虑让用户从下拉列表中选择时区,或者使用基于地图的时区选择器,比如这个。您可以考虑使用jsTimeZoneDetect来猜测列表的默认值,但不要完全依赖它。你的用户应该有能力改变它。

  • 永远不要问用户是否需要夏令时。大多数最终用户对自己时区的规则一无所知。让PHP处理您的DST问题。

如果您还没有,请查看时区标签wiki。那里有很多好的信息。

相关内容

  • 没有找到相关文章

最新更新