JavaScript日期对象未正确调整时区偏移量

4
我正在开发一个事件网站。我从MySQL数据库中获取UTC时间,并使用PHP将其输出到页面上,然后使用JavaScript将其转换为用户的时区。但是,不知何故,JavaScript给我提供了比我从MySQL获得的时间早两个小时的时间。我和我的服务器都在山区标准时区,因此JavaScript应该将日期向后推6个小时,但实际上日期向后推了8个小时。即使考虑夏令时,也只有一小时的差异,而不是两小时。
以下是将PHP时间戳转换为日期对象并以YYYY-mm-dd HH:ii:ss格式输出的JavaScript代码(使用jQuery):
function leadingzeros(string){
    if (string.toString().length == 1){
        string = "0" + string;
    }
    return string;
}

$(document).ready(function(){
    var thisdate = new Date(<?php echo (strtotime($row['start'])*1000);?>);
    $("#jsdate").html(
        thisdate.getFullYear()+"-"+leadingzeros((thisdate.getMonth()+1))+"-"+ leadingzeros(thisdate.getDate())+" "+
        leadingzeros(thisdate.getHours())+":"+leadingzeros(thisdate.getMinutes())+":"+leadingzeros(thisdate.getSeconds())
    );
});

这里是文档正文的PHP代码:
<?php
$row = mysqli_fetch_assoc($result);
echo "<ul><li>MySQL datetime object: ".$row['start']."</li>".
"<li>PHP Unix timestamp: ".strtotime($row['start'])."</li>".
"<li>PHP date string: ".date("Y-m-d H:i:s",strtotime($row['start']))."</li>".
"<li>PHP date minus 6 hours (which is our timezone offset): ".date("Y-m-d H:i:s",strtotime($row['start']) - (6*3600))."</li>".
"<li>Javascript date: <span id='jsdate'></span></li></ul>";
?>

它的输出结果如下:
  • MySQL日期时间对象:2012-04-07 23:00:00
  • PHP Unix时间戳:1333832400
  • PHP日期字符串:2012-04-07 23:00:00
  • 减去6个小时的PHP日期(我们的时区偏移值):2012-04-07 17:00:00
  • Javascript日期:2012-04-07 15:00:00

我已阅读了所有文档,但没有找到答案。为什么在MST中Javascript日期比PHP日期早两个小时?


你的服务器时间和客户端机器时间是否相同?如果是,时区也相同吗? - nandu
尝试这里:http://jsfiddle.net/wQMTu/ - 你看到了什么? - Alexander
不是答案,但这可能会有所帮助:我建议您将时间值存储和传输为UTC,并仅在向用户显示时间时在本地时间上进行转换。如果您这样做,您的服务器是MST而您的浏览器是(其他任何东西)就无关紧要了。它可以帮助消除大量的错误。它可以使重新托管变得更简单。等等。 - Cheeso
谢谢,我根据nandu的问题解决了这个问题。我的服务器实际上设置为欧洲/柏林时间,所以我将其切换到Etc/UTC,似乎解决了问题。 - cpedwards
2个回答

0
这种情况发生的原因是因为strtotime()在解析给定的日期/时间时,默认使用date.timezone设置,因此结果会相应地进行补偿。
要解决这个问题,您可以将date.timezone设置为Etc/UTC,或者像这样“锚定”来自数据库的时间戳:
strtotime("{$row['start']} GMT")

0

我刚刚使用这段代码在JS中弹出了日期。

var thisdate = new Date(<?php echo (strtotime('2012-04-07 23:00:00')*1000);?>);
    alert(thisdate);
    alert(<?php echo (strtotime('2012-04-07 23:00:00')*1000);?>);

我得到的是 enter image description here

所以你可以根据GMT时间来计算。在PHP和MySQL中,服务器必须配置时区,所以你不用担心。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接