我有一个带有时区的 ISO 时间戳:
> let datestring = "2016-07-15T09:20:32.730689-04:00";
我想将其格式化为人类可读的格式,例如"Jul 15 2016, 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
时区。好。
我还了解到:
- 使用 w/r/t 我的本地时区
toString()
格式,格式类似于asctime
, -
toISOString()
使用 ISO 8601 中的格式格式化 w/r/t UTC。
看起来都没有帮助,所以让我们看看库。
我尝试的下一件事是moment
:
> moment(datestring)._tzm
-240
好的,Moment不会丢失我约会的时区!这很好,我希望我可以使用像 Python 中的感知datetime
对象这样的moment
对象。那么如何格式化呢?
> 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
内部结构。
实现这一目标的"按书"方法是什么?
假设我对iso
格式很好,这可以在没有 moment
的情况下在香草 js 中完成吗?
我认为您正在寻找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
,那么它将使用输入字符串的时区。