【问题标题】:json datetime to javascript datetime gets me wrong datejson datetime 到 javascript datetime 让我错误的日期
【发布时间】:2013-04-30 10:24:54
【问题描述】:

我正在尝试将来自服务器的日期时间以 JSON 的形式转换为我可以在 HighChart 中使用的日期时间,但我总是得到错误的日期。

var json = {"lastMinute":"2013-05-06 15:46:00"}; // GMT

var lastMinute = json.lastMinute;
var a = lastMinute.split(' ');
var d = a[0].split('-');
var t = a[1].split(':');
var date = new Date(d[0],d[1],d[2],t[0],t[1],t[2]);

// NEED TO CONVERT TO LOCALTIME

此输出:2013 年 6 月 6 日星期四 15:46:00 GMT-0700 (PDT)

谁能让我摆脱痛苦,告诉我我做错了什么愚蠢简单的事情?

【问题讨论】:

  • 一句话:moment.js
  • 我喜欢 moment.js,但我们目前正在 KISS 开发中。
  • 我使用 moment.js(以及 jQuery 和 ..),因为我相信being lazy(因此,KISS?)。 KISS 的一部分是让其他人遇到(并解决)您面前的问题。我喜欢使用生成的 API 来抽象出问题。

标签: javascript json datetime epoch


【解决方案1】:

在 js 中,月份以 0 而不是 1 开头...

var json = {"lastMinute":"2013-05-06 15:46:00"}; // GMT

var lastMinute = json.lastMinute;
var a = lastMinute.split(' ');
var d = a[0].split('-');
var t = a[1].split(':');
var date = new Date(d[0],d[1]-1,d[2],t[0],t[1],t[2]);

【讨论】:

  • 该死的——你完全正确,我知道这一点。看 - 我说这非常简单。
【解决方案2】:

您可以使用 Datejs (https://code.google.com/p/datejs/wiki/APIDocumentation) 库。它非常有用,你有方法 parseExact:

Date.parseExact("10/15/2004", "M/d/yyyy");

【讨论】:

  • 在 Date.js 团队可以 get their act together 并生成稳定版本之前,我不建议使用它。他们仍然在 2007 年的“Alpha-1”中!请改用moment.js
  • 太稳定了,两年没更新了。 ;) link 但我同意你的观点,他们必须删除 alpha 标签!
  • 我希望。他们有一些好主意。上一次 code 签入是在 2008 年 11 月。如果它适合您 - 很好,但是当作者自己没有信心称其为稳定时,我绝不会将某些东西投入生产。另一方面,Moment 更加成熟,并且有在线单元测试来证明这一点。
  • 我尽量避免使用任何库或外部插件,并坚持使用老式的 JavaScript。
【解决方案3】:

要在 JavaScript 中最终解析和格式化日期,请使用 moment.js 库。

您可以明确说明 UTC,这在低级浏览器中工作得很好。

var m = moment.utc('2013-05-06 15:46:00');

这些值看起来像是 ISO8601 格式(没有T)。所以你应该对上面的代码没问题。但如果你想更精确,你可以这样做:

var m = moment.utc('2013-05-06 15:46:00', 'YYYY-MM-DD HH:mm:ss');

我建议尽可能长时间地将其保留为moment。他们的格式是一流的。但是,如果您需要将其作为 javascript 日期返回,只需执行以下操作:

var date = m.toDate();

【讨论】:

  • json 中的日期时间来自数据库,该数据库会更新最后一分钟的可用数据(四舍五入)。我的下一个新任务是使​​用 getTimezoneOffset() 将其从 SERVER GMT 转换为本地时间 - 这似乎还有一个小时。
  • @jbolanos - 请注意getTimezoneOffset 是您可能期望的相反符号。还要注意夏令时的偏移差异。如果您还有一个小时的休息时间(使用或不使用 momentjs),请更新您的原始问题或打开一个新问题,以便我们查看更多详细信息。谢谢。
  • 是的 - 我做了一个变量来设置 DST 真或假(将是手动的)和一个 if 将 60 添加到 getTimezoneOffset() 如果为真。
  • @jbolanos - getTimezoneOffset 已经根据日期值调整为 DST。但它假设日期已经是本地日期 - 而不是 UTC。看看它是如何迅速变得复杂的? Momentjs 是你的朋友——真的。
  • true - 但 DST 的服务器时间不会改变 - 它锁定为 GMT
猜你喜欢
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 1970-01-01
相关资源
最近更新 更多