【问题标题】:How to format a date in a given timezone in Javascript?如何在Javascript中格式化给定时区的日期?
【发布时间】: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


【解决方案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"

默认时刻将使用本地时区,但如果您使用parseZone,那么它将使用输入字符串的时区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多