问题 #1
主要问题是在您的转换步骤中使用strtotime
. PHP 尝试猜测时间字符串与时区的关系(可能使用您的时区),但在您的情况下,它需要知道更多才能正确猜测。您可以通过明确告诉 PHP 时间字符串表示为 GMT(格林威治标准时间)来做到这一点。
由于您的数据库只有 YYYY-MM-DD HH:MM:SS 的形式,因此您可以在strtotime
调用期间将必要的 GMT 标识符连接到它上面。
$time = strtotime('2013-07-19 10:12:56' . ' GMT');
例如:
<pre>
<?php
$time = strtotime('2013-07-19 10:12:56' . ' GMT');
echo("Converting to UNIX Time: $time\n");
echo("Converting to JS Time: ");
echo ($time*1000);
?>
</pre>
转换为 UNIX 时间:1374228776
转换为 JS 时间:1374228776000
将生成的 UNIX 时间粘贴到 Epoch Converter 中会正确导致GMT: Fri, 19 Jul 2013 10:12:56 GMT
问题 #2
如上所述更改您的 PHP 代码是必要的,但由于它不能完全为您工作,我可以看到您还有一个问题正在发生。(塞巴斯蒂安试图帮助你解决这个问题。)
我要添加到 Sebastian 的评论中的是,在您的 JavaScript 中创建任何图表或图表对象之前,需要配置全局设置。否则它们对这些图表的输出没有影响。因此,您需要确保在代码中存在任何图表对象之前应用以下配置。
Highcharts.setOptions({
global: {
useUTC: false
}
});
(如果您不使用此配置,您的图表仍然可以正常工作,但日期和时间将显示相对于格林威治标准时间,而不是每个查看图表的用户的本地时区。)
讨论(放在后面,讨厌讨论的人不用看):
我验证了如果您按照上述建议修改您的 PHP 代码,那么您现在将正确的 UTC/GMT 数字纪元时间传递给 JavaScript。您可以使用以下代码确认 100%:
Date.UTC(2013, 6, 19, 10, 12, 56)
1374228776000
new Date(1374228776000).toUTCString()
"Mon, 19 Aug 2013 10:12:56 GMT"
您显然面临的第二个问题是双重的:让 Highcharts 正确地将其解释为 UTC/GMT 值,而不是来自其他(例如本地)时区的值,并告诉 Highcharts 以您想要的格式正确输出时区。
使 Highcharts 正确解释您的时间数字:默认情况下,Highcharts 假定像这样的数字时间数据采用 UTC [[1331028000000, 5], [1331031600000, 6], [1331035200000, 4]]。除非你的 JavaScript 中潜伏着一些奇怪的东西并改变了时间数据的处理方式,否则你应该在这方面做得很好。
使 Highcharts 在您的图表上以人类可读的日期显示正确的时间:这是您应该密切关注 API 的地方:http: //api.highcharts.com/highcharts#global.useUTC
顺便说一句,Sebastian Bochan 是 Highcharts 支持团队的成员,所以你当然可以相信他的评论。