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

Posted

技术标签:

【中文标题】Javascript 日期对象未正确调整时区偏移【英文标题】:Javascript Date Object Not Adjusting for Timezone Offset Properly 【发布时间】:2012-04-20 21:21:18 【问题描述】:

我正在开发一个活动网站。我从本地主机上的 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 PHP 日期减去 6 小时(这是我们的时区偏移量):2012-04-07 17:00:00 Javascript 日期:2012-04-07 15:00:00

我读过的所有文档都没有给出答案。为什么 MST 中的 Javascript 日期比 PHP 日期晚两个小时?

【问题讨论】:

你的服务器时间和客户端机器时间一样吗?如果是,时区是否也相同? 在这里试试:jsfiddle.net/wQMTu - 你看到了什么? 不是一个答案,但这可能会有所帮助:我建议您以 UTC 存储和传输时间值,并且仅当它们将显示给用户时、何时以及在何处将它们转换为本地时间。如果您这样做,那么您的服务器是 MST 而您的浏览器是(其他任何东西)都没有关系。它可以帮助消除一大类错误。它可以使重新托管更简单。等等。 谢谢,我想我已经根据 nandu 的问题解决了这个问题。我的服务器实际上设置为欧洲/柏林时间,所以我将其切换为 Etc/UTC,这似乎解决了它。 【参考方案1】:

我只是使用这段代码在 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);?>);

我得到的是

所以你有时间在 gmt .in php 和 mysql 服务器必须配置时区。所以你不必担心。

【讨论】:

【参考方案2】:

之所以会出现这种情况是因为strtotime()在解析给定的日期/时间时默认使用date.timezone设置,所以结果会得到相应的补偿。

要解决此问题,您可以将 date.timezone 设置为 Etc/UTC 或“锚定”数据库中的时间戳,如下所示:

strtotime("$row['start'] GMT")

【讨论】:

以上是关于Javascript 日期对象未正确调整时区偏移的主要内容,如果未能解决你的问题,请参考以下文章

javascript显示中的时区偏移

时区分钟偏移量的 TimeZoneInfo

如何在 JavaScript 中使用 ISO 8601 格式化带有时区偏移的日期?

javascript toISOString() 忽略时区偏移

.NET 通过时区名称获取时区偏移量

带有 pytz 时区的日期时间。不同的偏移量取决于 tzinfo 的设置方式[重复]