我有一个带有时区的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
格式不错吗?
答案 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
,则它将使用输入字符串的时区。