【问题标题】:MySql TimeStamp and JavaScript TimeMySql 时间戳和 JavaScript 时间
【发布时间】:2013-07-22 08:03:51
【问题描述】:

我在 GMT 时间 [2013-07-19 10:12:56] 的 MySQL 数据库中有一个时间戳。 我知道它应该作为 DateTime 和 UTC 在数据库中,但不幸的是它就是这样。

我需要提取时间戳并传递给 JavaScript [HighCharts]。

$time = strtotime('2013-07-19 10:12:56');
echo("Converting to UNIX Time: ");echo $time;
echo("Converting to JS Time: ");echo ($time*1000);

由于 JavaScript 需要以毫秒为单位的时间,因此乘以购买 1000

输出:转换为 UNIX 时间:1374253976

输出:转JS:时间:1374253976000

我的问题是为什么它在 HighCharts 中显示为 17.12

当我将 1374253976000 放入 http://www.epochconverter.com 时,我得到:
格林威治标准时间:格林威治标准时间 2013 年 7 月 19 日星期五 17:12:56,这是不正确的。数据库中显示的时间应该是 10:12:56。

任何想法为什么它会是 7 小时?

【问题讨论】:

  • 您是否尝试禁用 UTC 时间 (api.highcharts.com/highstock#global.useUTC)
  • 是的,但未来还有 7 小时。 var highchartsOptions = Highcharts.setOptions(Highcharts.theme,{ global: { useUTC: false }});
  • 它很奇怪,因为当我运行时,即 new Date(1374253976000) 也是正确的数据(和你的一样)。
  • 你遇到了同样的问题?
  • 我收到了正确的数据,所以无法复制这个问题。

标签: javascript time highcharts


【解决方案1】:

Epochtimeconverter 表示 Fri, 19 Jul 2013 10:12:56 GMT 有以下纪元时间

Epoch timestamp: 1374228776 
Timestamp in milliseconds: 1374228776000
Human time (GMT): Fri, 19 Jul 2013 10:12:56 GMT
Human time (your time zone): Friday, July 19, 2013 3:42:56 PM

请注意,它不是 1374253976 如您所见。这就是问题所在,从 epochtime 到 highcharts 等的转换是正确的。是你的时代错了

除非另有说明,否则 PHP 会将字符串视为在服务器的时区中。 试一试,将时区明确指定为GMT,如下所示

$time = strtotime('2013-07-19 10:12:56' . ' GMT');
echo("Converting to UNIX Time: ");echo $time;
echo("Converting to JS Time: ");echo ($time*1000);

您观察到的 7h 差异可能是因为您的服务器位于 -7 时区?

【讨论】:

  • 感谢您的帮助,服务器确实在-7时区。
【解决方案2】:

问题 #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 的 cmets 是在您的 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 支持团队的成员,所以你当然可以相信他的 cmets。

【讨论】:

  • 抱歉,在单击答案之前,我确实没有阅读 Jugal 的其余答案(停在“这就是问题所在”这个词上,因为我还没有看到任何解决方案)。如果我读完他的所有答案,我会看到他提出了完全相同的建议。哎呀!我留下我的答案是因为我认为这是一个更清晰的解释(我测试了它而不是说尝试它),但 Jugal 有权要求赏金。
  • @DevilCode 不客气!如果您还有任何问题,请告诉我们,我们很乐意帮助您解决这些问题。
【解决方案3】:

您遇到了时区问题。在 GMT 时,时间戳 2013-07-19 10:12:56 在纪元后转换为 1374228776 秒:http://jsfiddle.net/hsvtE/

但是您的 PHP 脚本会返回不正确的 unix 时间:

输出:转换为 UNIX 时间:1374253976

如您所见,两个时间戳之间的区别是:

 1374253976 (incorrect)
-1374228776 (correct)
-----------
      25200 seconds

您的 PHP 脚本返回的时间比格林威治标准时间早25200 秒(或七个小时)。 PHP 返回错误时间的原因是 strtotime 函数的工作方式。

如果时间戳中没有指定时区,则strtotime 假定时间戳属于默认时区。

有两种方法可以解决这个问题:

方法一:设置默认时区为GMT

您可以使用date_default_timezone_getdate_default_timezone_set 函数在PHP 中获取和设置默认时区。使用这两个函数,您可以为时间戳设置正确的时区,如下所示:

function get_time($timestamp, $timezone = 'GMT') {
    $default_timezone = date_default_timezone_get(); // get current timezone
    date_default_timezone_set($timezone);            // set correct timezone
    $time = strtotime($timestamp);                   // get correct time
    date_default_timezone_set($default_timezone);    // reset original timezone
    return $time;                                    // return correct time
}

现在您只需调用get_time 而不是strtotime,就可以安全地获得正确的格林威治标准时间:

$time = get_time('2013-07-19 10:12:56');

我推荐你使用这种方法,因为如果时间戳已经指定了一个时区,那么strtotime 会简单地忽略默认时区并使用指定的时区。

方法2:在时间戳本身中指定时区

第二种方法要短得多:

function get_time($timestamp, $timezone = 'GMT') {
    return strtotime($timestamp . ' ' . $timezone);
}

$time = get_time('2013-07-19 10:12:56');

不过,我建议您改用第一种方法,因为它更安全。例如,如果您提供了时间戳2013-07-19 10:12:56 EST,那么上述函数将调用strtotime,并使用带有两个时区的字符串-2013-07-19 10:12:56 EST GMT

结论

这个简单的更改应该可以解决您的问题。如果您想要以毫秒为单位的时间,只需将时间乘以1000

$time = 1000 * get_time('2013-07-19 10:12:56');

我假设您的客户端代码是正确的。因此,如果你仍然有问题,那么你应该看看你的 JavaScript。

【讨论】:

    【解决方案4】:

    其实不是JS的问题。诀窍在于 PHP 以及“strtotime”如何根据默认时区进行转换。

    在您的示例中,时间戳的计算就像您在“America/Los_Angeles”时区一样,因此您会得到1374253976 秒,而不是时区“GMT”的1374228776。由于您在 epochconverter 上将时间戳转换为相对于 GMT 时区,因此会出现“不匹配”。

    您存储在 MySQL 中的数据是 GMT,您的 PHP 安装时区是“America/Los_Angeles”。当您“strtotime”时,您将数据解释为 MYSQL 不是 GMT 而是 America/Los_Angeles。这就是为什么两者之间有 7 个小时的时间。

    这里有一个小脚本可以更好地解释这一点:

    date_default_timezone_set('GMT');
    
    echo strtotime('2013-07-19 10:12:56', time() - 10) . "\n";
    
    date_default_timezone_set('America/Los_Angeles');
    
    echo strtotime('2013-07-19 10:12:56', time() - 10) . "\n";
    

    将显示:

    1374228776 // from epochconverter : Fri, 19 Jul 2013 10:12:56 GMT
    1374253976 // from epochconverter : Fri, 19 Jul 2013 17:12:56 GMT
    

    注意序列“287”是如何被序列“539”替换的。

    在 PHP 中,几乎每个操作时间的函数都会根据当前定义的时区来操作。

    查看此以获取更多信息:

    PHP Default TimeZone

    【讨论】:

      猜你喜欢
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      相关资源
      最近更新 更多