【问题标题】:How to make Moment.js ignore the user's timezone?如何让 Moment.js 忽略用户的时区?
【发布时间】:2019-09-13 20:47:24
【问题描述】:

我有一个表单,我可以在其中输入在某个时间开始的事件。比如说早上 9 点。

为了分配一个日期/时间对象,我正在使用 MomentJs。在不同的时区显示它时会出现问题。

在伦敦将按预期显示9am - 在基辅将显示11am

如何让 MomentJS 和浏览器忽略与用户相关的时区,而只显示我给出的时间?

这是我的代码:

<p>
Start time:
{moment(event.startDate).format("HH:mm")} 
</p>

【问题讨论】:

标签: javascript timezone momentjs


【解决方案1】:

假设您已将日期存储为 utc(在这种情况下您可能应该有),您可以使用以下内容:

moment.utc(event.startDate).format("HH:mm")

【讨论】:

    【解决方案2】:

    让我在 Vanilla JavaScript 中提供一个替代答案。如果您想将时区设置为“中性”,您可以先使用 toISOString() 将其转换为 UTC。

    const current = new Date();
    const utcCurrent = current.toISOString();
    
    console.log(utcCurrent);

    如果要将其转换为特定时区,例如伦敦,可以使用toLocaleString()。不过,请注意 browser supporttimezone

    const londonTime = new Date().toLocaleString('en-US', { timeZone: 'Europe/London' })
    console.log(londonTime);

    【讨论】:

      【解决方案3】:

      您想要的是标准化的日期时间。这可能会让人有些困惑,因为时区的概念是一个相当随意的结构。

      我喜欢将日期时间值视为“绝对”和“相对”。无论您在哪个时区,“绝对”日期时间都是正确的。最常见的例子是 UTC(+000) 和 UNIX 时间(也称为 Unix 纪元、POSIX 时间或 Unix 时间戳)。

      UTC 非常明显。它是 +000 时区的当前时间。 UNIX 时间更有趣一些。它表示自 1970 年 1 月 1 日以来经过的秒数。

      您应该始终将数据存储在客户端和后端,作为“绝对”时间。我的偏好是 UNIX 时间,因为它表示为单个整数(又好又干净)。

      moment.js 为你做这件事。当您实例化 moment 对象时,您可以使用:

      var date = moment.utc(utcString)

      或 Unix 时间

      var date = moment.unix(unixInt)

      然后您可以使用此对象以您希望的任何形式显示日期:

      console.log(date.tz.("America/Toronto"))

      【讨论】:

        猜你喜欢
        • 2020-08-28
        • 1970-01-01
        • 1970-01-01
        • 2020-04-27
        • 1970-01-01
        • 2014-10-15
        • 2018-12-14
        • 2014-11-12
        • 1970-01-01
        相关资源
        最近更新 更多