【发布时间】:2016-07-15 13:53:00
【问题描述】:
我有一个带时区的 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()格式使用我的本地时区,格式类似于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 内部。
实现这一目标的“按部就班”方式是什么?
假设我对iso 格式没问题,这可以在没有moment 的香草js 中完成吗?
【问题讨论】:
-
在 vanilla js 中很难做到这一点。你见过moment timezone吗?这可能会有所帮助。
-
我通常使用
moment-timezone来表示“在美国/东部显示此日期”。这是另一种情况:我已经有了一个带有所需时区偏移量的时间戳。
标签: javascript datetime momentjs