如何在Javascript中格式化给定时区的日期?

时间:2016-07-15 13:53:01

标签: javascript datetime momentjs

我有一个带有时区的ISO时间戳:

> let datestring = "2016-07-15T09:20:32.730689-04:00";

我希望将其格式化为人类可读的格式,例如" 2016年7月15日,09:20"同时保持时区。

我先试了这个:

> new Date(datestring).toString()
"Fri Jul 15 2016 15:20:32 GMT+0200 (CEST)"
> new Date(datestring).toISOString()
"2016-07-15T13:20:32.730Z"

当然,这不能做我想要的事情,因为new Date()仅存储自纪元以来的毫秒数,并且-04:00时区在解析后被删除。好。

我也了解到:

  • toString()格式使用w / r / t我的本地时区,格式类似于asctime
  • toISOString()格式为w / r / t UTC,格式为ISO 8601.

两者看起来都没有用,所以让我们看看这些库。

我尝试的下一件事是moment

> moment(datestring)._tzm
-240
好吧,Moment并没有失去我约会的时区!这很好,我希望我可以在Python中使用moment对象,如感知datetime对象。那么我该如何格式化呢?

> moment(datestring).toString()
"Fri Jul 15 2016 15:20:32 GMT+0200"
> moment(datestring).toISOString()
"2016-07-15T13:20:32.730Z"

哦,看起来像Moment只是将请求转发到日期时间。让我们尝试一下:

moment(datestring).format("MMM D YYYY, HH:mm")
"Jul 15 2016, 15:20"

格式看起来很不错但是这15:20是什么?哦,那是我当地的时间。看起来format()也假设我想忽略日期时间的解析时区偏移,我更喜欢我的本地时区。这里没有运气。

但是moment().utcOffset允许我指定给定的时区偏移:

> let m = moment(datestring)
> m.utcOffset(m._tzm).format("MMM D YYYY, HH:mm")
"Jul 15 2016, 09:20"

是的,它有效!但是我没有在任何地方看到这个_tzm,看起来我现在正在弄乱moment内部。

""书"实现这个目标的方法?

这可以在没有moment的vanilla js中完成,假设我的iso格式不错吗?

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找parseZone功能:

let datestring = "2016-07-15T09:20:32.730689-04:00";
let m = moment.parseZone(datestring);

m.hour();                      // 9
m.format("MMM D YYYY, HH:mm"); // "Jul 15 2016, 09:20"

默认情况下,moment将使用本地时区,但如果您使用parseZone,则它将使用输入字符串的时区。

相关问题