如何让Moment.js忽略用户的时区?



我有一个表单,我在其中输入一个在特定时间开始的事件。假设上午9点。

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

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

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

这是我的代码:

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

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

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

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

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

如果要将其转换为特定时区,例如伦敦,可以使用 toLocaleString()。请注意浏览器对timezone的支持。

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

你想要的是一个规范化的日期时间。这可能会有点令人困惑,因为时区的概念是一个相当武断的结构。

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

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"))

我解决这个问题的唯一方法是从字符串中删除时区和毫秒信息。 我用过date-fns库,但我想moment也会以同样的方式工作。

import { format } from 'date-fns'
const myDateTimeString = '2022-02-22T19:55:00.000+01:00'
const dateTimeWithoutTimezone = myDateTimeString.slice(0, 16) // <- 2022-02-22T19:55
format(new Date(dateTimeWithoutTimezone), 'HH:mm')

相关内容

  • 没有找到相关文章