【问题标题】:Timezone issues using unix time, php, mysql使用 unix 时间、php、mysql 的时区问题
【发布时间】:2012-10-23 18:29:21
【问题描述】:

我昨晚花了 8 个多小时检查所有文档,浏览各种帖子等,我几乎解决了我的问题,但仍然缺少一些我无法理解的东西。

我有一个表,其中存储了带有 unix 时间戳的各种用户提交(例如 1351867293)。我正在提取这些信息并对其进行计数,以获得“今天”、“昨天”、“本周”等提交的总数。

我使用的代码(用于“今天的提交”)是:

WHERE DATE(from_unixtime(comment_date)) = CURRENT_DATE";

到目前为止一切顺利,但存在时间偏移,数据显示不正确。 stackoverflow 上的用户建议使用 CONVERT_TZ 来固定偏移量。

这就是我卡住的地方。我位于 CST 时区,我的服务器似乎位于 EST 时区。所以我使用了这段代码

 WHERE DATE(CONVERT_TZ(from_unixtime(comment_date), 'EST', 'CST')) = CURRENT_DATE";

...但它只显示“0”,尽管我今天有提交。我尝试了不同的时区,但结果它们都给了我“0”。当我用数字替换 EST 和 CST 时,例如:

 WHERE DATE(CONVERT_TZ(from_unixtime(comment_date), '+00:00', '+07:00')) = CURRENT_DATE";

...我得到一个数字输出,但数字不正确。我尝试了很多组合,包括 +08:00、-05:00,但似乎没有任何效果。

基本上我要问的是,为了得到正确的结果,我必须将哪些值作为这两个数字?我网站上的其他所有内容都可以在我的时区 (CST) 中正确显示,我只遇到了这个查询的问题。

如果有帮助,我的服务器的 IP 是 50.116.13.130。

【问题讨论】:

    标签: php mysql date offset convert-tz


    【解决方案1】:

    Unix 时间戳始终采用 UTC,因此您的服务器设置的时区无关紧要。

    但是,您必须确保使用正确的时区转换“comment_date”的字符串表示形式:

    // Use the timezone you are in (CST). If you're having user
    // submissions from all over the world, use the timezone
    // from where the submission came from.
    $timezone = new DateTimeZone("CST"); 
    $date = new DateTime("2012-01-02", $timezone);
    $unixTimestamp = $date->getTimestamp();
    

    另一个重要的事情是注意“2012-01-02”将被转换为“2012-01-02 00:00:00”。和“2012-01-02 00:00:00”!=“2012-01-02 04:03:27”。

    所以当你想要今天的日期时,你应该查询一个间隔。

    $today = new DateTime(); // Get current time
    $today->setTimezone(new DateTimeZone("CST"));
    $today->setTime(0,0,0); // Set time to midnight of today (depends on your definition of today, could also be -24h
    
    $sql = "[..] WHERE comment_date > ".$today->getTimestamp();
    

    【讨论】:

    • 我的问题是,我有这一行 ** WHERE DATE(CONVERT_TZ(from_unixtime(comment_date), '$timezone1', '$timezone2')) = CURRENT_DATE"; ** 在 60 多个文件中. $timezone1$timezone2 是通过 header.php 解析的 - 所以我必须使用数值。我之前尝试过你的方法,但它弄乱了其他日期时间显示我的网站 - 我使用的后端通常会转换时区,我唯一的问题是这个自定义代码用于统计 - 这是唯一搞砸时区的事情
    • 好的,我明白了。但是如果你在 DATE(CONVERT_TZ(from_unixtime(comment_date), 'EST', 'CST')) 上做一个 select 语句,它会达到你的预期吗?
    • 不,由于某些原因,我不能使用“EST”或“CST”,唯一有效的是数值,例如“+05:00”或“-06:00”。
    • 好的,但是您的 comment_date 字段的类型是什么?无符号整数或时间戳?它是否存储在UTC?如果它是 UTC 时间戳,您可以尝试 WHERE DATE(comment_date) = CURRENT_DATE。也许我不完全理解你的问题,但作为未来的经验法则 - 始终以 UTC 存储日期。
    • int(10) 并将时间戳存储在 UTC 中。如果我使用“WHERE DATE(comment_date) = CURRENT_DATE”,我会得到 UTC 时间的结果,而不是 CST 时间的结果 - 通过使用 convert_cz 我试图将时间“添加”到结果中,因此所有内容都在输出中同步。
    【解决方案2】:

    我终于通过使用解决了它

      $timezone1 = '+12:00';
      $timezone2 = '-04:00';
    

     DATE(CONVERT_TZ(from_unixtime(comment_date), '$timezone1', '$timezone2')) = CURRENT_DATE"; 
    

    为了让我的 8 小时时差工作。它可以工作,尽管违反所有逻辑,因为我的服务器时间是 UTC(+0 小时),输出应该是 CST(+8 小时)。所以基本上

      $timezone1 = '+00:00';
      $timezone2 = '+08:00';
    

    应该得到我想要的结果,但它没有。我不知道为什么,但我很高兴我的第一个代码引用现在有效。

    【讨论】:

      【解决方案3】:

      请注意,除非您使用 JavaScript,否则您的位置并不是很重要。重要的是服务器位置。因此,如果您在 CST 中,并且您的服务器在 EST 中,那么您所有操作的时间都将在 EST 中,因为 PHP 是服务器端。

      我认为最好的方法是使用 UTC 时间。您使用以下方法将服务器重置为 UTC:

      date_default_timezone_set("UTC");
      

      设置 UTC 后,您的所有时间现在都会从 UTC 重置为 0 偏移,这样会更容易处理。我个人使用以下函数在 PHP 和 MySQL 日期之间切换

      $mysqldate = date( 'Y-m-d H:i:s', $phpdate );
      $phpdate = strtotime( $mysqldate );
      

      但同样,您可以使用时间戳。这个article可能会为你提供一些答案

      我不确定我是否回答了你的问题,但我希望这些是对你的指点。

      干杯。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-02
        • 2010-09-24
        相关资源
        最近更新 更多