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



我有一个带有时区的 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,那么它将使用输入字符串的时区。

相关内容

  • 没有找到相关文章

最新更新