0

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

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

我试过了:

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

上面的代码有效,但前提是时区是正偏移量,例如06:00. 我怎样才能解决这个问题?

4

3 回答 3

0

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

if UserTimeZone < 0
    userTime = serverTime - UserTimeZone

else 
    userTime = serverTime + UserTimeZone
于 2013-07-13T03:53:59.127 回答
0

不要那样存储它们。DST不仅仅是启用/禁用。

PHP 完全支持 IANA 时区。改用那些。

例如,使用Europe/LondonAmerica/Los_Angeles

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

您还需要注意以下几点:

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

  • 您说您正在通过 JavaScript 从您的用户那里收集时区偏移量。虽然这是可能的,但这不是一个好的做法。当您这样做时,您仅捕获当前应用的偏移量。相反,您应该考虑让您的用户从下拉列表中选择他们的时区,或者使用基于地图的时区选择器,例如这个。您可能会考虑使用jsTimeZoneDetect来猜测列表的默认值,但不要完全依赖它。您的用户应该能够更改它。

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

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

于 2013-07-13T04:12:31.697 回答
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;
}

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

于 2013-07-13T04:17:40.690 回答