我有一个表单,我在其中输入一个在特定时间开始的事件。假设上午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')