【问题标题】:Using timezone offset PHP使用时区偏移 PHP
【发布时间】:2013-07-11 16:44:33
【问题描述】:

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

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

我试过了:

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

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

【问题讨论】:

    标签: php mysql date timezone offset


    【解决方案1】:

    不要以这种方式存储它们。除了启用/禁用 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 来猜测列表的默认值,但不要完全依赖它。您的用户应该能够更改它。

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

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

    【讨论】:

    • 如果您能解释我如何使用 php 时区转换数据库上的时区,我很乐意这样做,但我无法弄清楚
    • 在您的 PHP 代码中进行转换,而不是在数据库中。 PHP手册中有例子here.
    • 如果你需要一个更直接的例子,StackOverflow 上已经有很多了。例如,this one
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 代码不准确,但你明白了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      相关资源
      最近更新 更多