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

ne5o7dgx  于 2023-01-24  发布在  Java
关注(0)|答案(4)|浏览(189)

我在一个表单中输入了一个在特定时间开始的事件,比如说上午9点。
为了分配一个日期/时间对象,我使用了MomentJs。当在不同的时区显示它时,问题就出现了。
在伦敦将显示9am预期-在基辅将显示11am
如何让MomentJS和浏览器忽略与用户相关的时区,而只显示我给出的时间?
下面是我的代码:

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

kyxcudwk1#

假设您已经将日期存储为utc(在本例中您可能应该这样做),则可以使用以下代码:

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

hof1towb2#

让我用VanillaJavaScript提供另一个答案。如果你想让它成为“中性”时区,你可以先用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);
6tqwzwtp

6tqwzwtp3#

您需要的是一个规范化的日期时间。这可能会有点混乱,因为时区的概念是一个相当随意的构造。
我喜欢将日期时间值分为“绝对”和“相对”。“绝对”日期时间是指无论您处于哪个时区都为真的时间。最常见的例子是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"))

c9qzyr3d

c9qzyr3d4#

解决这个问题的唯一方法是从字符串中删除时区和毫秒信息。我使用了date-fns lib,但我想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')

相关问题