【问题标题】:Taking UTC time from database and displaying local time in browser从数据库中获取 UTC 时间并在浏览器中显示本地时间
【发布时间】:2015-03-19 08:44:14
【问题描述】:

我有一个包含 UTC 日期时间的表。我正在使用 PHP 将这些日期/时间字符串返回到 JSON 中的 AJAX 请求。我在前端收到的这些字符串之一的示例是“2014-12-22 09:36:54”。我想在本地时间向用户显示这个。例如,我比加利福尼亚的 UTC 时间晚 8 小时,所以我希望看到类似“2014-12-22 01:36:54”的内容。

在 javascript 中,我尝试了 new Date("2014-12-22T09:36:54").toLocaleString() 并得到了 "12/22/2014, 9:36:54 AM"---基本上是一个不变的日期/时间。

我尝试了 new Date("2014-12-22T09:36:54").toUTCString() 并得到了“星期一,2014 年 12 月 22 日 17:36:54 GMT”,这与我的结果几乎相反通缉。但我想这应该很明显。

最后的想法...:

我是否必须进行一些涉及 getTimezoneOffset() 的操作?

这在 PHP 后端会更容易解决吗?

最后一点是,我认为 jstz.js 会有所帮助,但它所做的只是返回时区名称,我不知道这有什么特别有用的地方。是否有任何函数将时区的名称作为参数在这种情况下会有所帮助?

【问题讨论】:

  • JavaScript 在日期和时间方面是出了名的难用。如果你能用 PHP 解决它,那就这样做吧,免得你自己头疼。
  • 我看不出有什么库或工具可以提供帮助;如果您在输入中没有时区,则您无法神奇地发明它。如果您有一个有效的日期,它将使用 toLocaleString 在正确的时间显示

标签: javascript php datetime


【解决方案1】:

要可靠地将诸如“2014-12-22 09:36:54”之类的 UTC 字符串转换为本地字符串,请手动对其进行解析,例如:

function parseISOAsLocal(s) {
  var b = s.split(/\D/);
  return new Date(Date.UTC(b[0], b[1]-1, b[2], b[3], b[4], b[5]));
}

根据当前的ECMA-262 standard (ed5),必须将不带时区的符合 ISO 8601 的字符串视为 UTC。但是,draft version 6 将其更改为将它们视为本地(根据 ISO 8601)。大多数浏览器将其视为 UTC,但 Chrome 将其视为本地(IE 8 视为 NaN)。手动解析日期字符串并避免浏览器变幻莫测要好得多。

【讨论】:

  • 酷,另一位反对者懒得解释或提供替代答案。
猜你喜欢
  • 2018-07-02
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
相关资源
最近更新 更多