我在一个表单中输入了一个在特定时间开始的事件,比如说上午9点。
为了分配一个日期/时间对象,我使用了MomentJs。当在不同的时区显示它时,问题就出现了。
在伦敦将显示9am
预期-在基辅将显示11am
。
如何让MomentJS和浏览器忽略与用户相关的时区,而只显示我给出的时间?
下面是我的代码:
<p>
Start time:
{moment(event.startDate).format("HH:mm")}
</p>
我在一个表单中输入了一个在特定时间开始的事件,比如说上午9点。
为了分配一个日期/时间对象,我使用了MomentJs。当在不同的时区显示它时,问题就出现了。
在伦敦将显示9am
预期-在基辅将显示11am
。
如何让MomentJS和浏览器忽略与用户相关的时区,而只显示我给出的时间?
下面是我的代码:
<p>
Start time:
{moment(event.startDate).format("HH:mm")}
</p>
4条答案
按热度按时间kyxcudwk1#
假设您已经将日期存储为utc(在本例中您可能应该这样做),则可以使用以下代码:
hof1towb2#
让我用VanillaJavaScript提供另一个答案。如果你想让它成为“中性”时区,你可以先用toISOString()把它转换成UTC。
如果你想把它转换成一个特定的时区,比如伦敦,你可以使用toLocaleString(),但是一定要注意浏览器对
timezone
的支持。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"))
c9qzyr3d4#
解决这个问题的唯一方法是从字符串中删除时区和毫秒信息。我使用了
date-fns
lib,但我想moment
也会以同样的方式工作。