忽略时区偏移的Javascript日期时间字符串(实验)

时间:2015-10-05 13:53:49

标签: javascript angularjs datetime timezone momentjs

我最糟糕的噩梦是日期对象,所以我创建了一个小提琴,看看它是如何工作的,并尝试使用以下格式找到日期字符串的解决方案2015-10-05T11:49:13.587Z但要注意当前的时区。

基本上,我希望能够写new Date()(或类似)并获取2015-10-05T09:49:13.587Z而不是2015-10-05T11:49:13.587Z

似乎显示正确日期/时间的唯一方法是:

  • moment().format()
  • new Date().toLocaleString()
  • moment().toLocaleString()
  • moment().format().toLocaleString()

但是他们都没有返回像我想要的那样的日期对象。那么处理它的正确方法是什么?

请检查我的测试: http://codepen.io/Frondor/pen/PPmYpv

3 个答案:

答案 0 :(得分:2)

  

基本上,我希望能够写new Date()(或类似)并获取2015-10-05T09:49:13.587Z而不是2015-10-05T11:49:13.587Z

你要求的价值是提前两个小时。以这种方式转换它是无效的。

我认为你混淆了两件截然不同的事情:

  • UTC不是格式。这是一个计时系统。当我们说“在UTC中”时,我们的意思是时间值以世界时间表示 - 这在全球范围内是相同的,并且与GMT(在不考虑夏令时的英格兰格林威治时间)大致相同。如果您当地时间比UTC晚两个小时,则UTC比您当地时间早两个小时。

  • ISO-8601格式是日期和时间的字符串表示。有几种形式,您表达的形式是时间戳扩展格式。换句话说,它代表事件发生的实际时刻,包括日期,时间和与UTC的关系。

    在这种格式中,Z具体表示“此处显示的值已经是UTC”。它与使用+00:00大致相同。

因此,如果UTC中的值为ISO8601字符串为2015-10-05T11:49:13.587Z,则相应的本地值(假设您所说的UTC-2)为2015-10-05T09:49:13.587-02:00。这仍然是ISO8601格式,但不再是UTC格式。

获得此功能的最简单方法是使用moment().format()来使用moment.js。

答案 1 :(得分:1)

此格式 - 2015-10-05T11:49:13.587Z - 是Coordinated Universal Time (UTC)ISO 8601格式的日期和时间的标准表示之一。

时区不会以这种格式显示,因为格式本身的目的是(如维基百科文章中所述):

  

日期和时间的表示是一项国际标准   涵盖日期和时间相关数据的交换。

但是我们绝对可以用该格式显示日期以及当前时区的偏移量,但它本身就违背了“标准”格式的目的。

答案 2 :(得分:1)

您要求它产生不准确的时间。您正在寻找的格式意味着UTC时间。我建议你检查一下你的要求,因为那里可能存在缺陷。
但如果这正是你想要的,你会说:
moment().format("YYYY-MM-DDThh:mm:ss.SSSS") + 'Z'