如何忽略用户的时区并强制Date()使用特定的时区

如何忽略用户的时区并强制Date()使用特定的时区,第1张

如何忽略用户的时区并强制Date()使用特定的时区

Date对象的基础值实际上是UTC。为了证明这一点,请注意,如果您键入内容

new Date(0)
,则会看到类似:的信息
Wed Dec 31 196916:00:00 GMT-0800 (PST)
。GMT中将0视为0,但
.toString()
方法显示本地时间。

重要说明,UTC代表 世界 时码。当前在2个不同位置的当前时间是相同的UTC,但是输出的格式可以不同。

我们需要的是一些格式

var _date = new Date(1270544790922); // outputs > "Tue Apr 06 2010 02:06:30 GMT-0700 (PDT)", for me_date.toLocaleString('fi-FI', { timeZone: 'Europe/Helsinki' });// outputs > "6.4.2010 klo 12.06.30"_date.toLocaleString('en-US', { timeZone: 'Europe/Helsinki' });// outputs > "4/6/2010, 12:06:30 PM"

这行得通,但是…您不能真正将其他任何日期方法用于您的目的,因为它们描述了用户的时区。您需要的是与赫尔辛基时区相关的日期对象。此时,您的选择是使用某些3rd
party库(我建议这样做),或修改date对象,以便您可以使用大多数方法。

选项1-第三方,例如moment-timezone

moment(1270544790922).tz('Europe/Helsinki').format('YYYY-MM-DD HH:mm:ss')// outputs > 2010-04-06 12:06:30moment(1270544790922).tz('Europe/Helsinki').hour()// outputs > 12

这看起来比我们接下来要做的要优雅得多。

选项2-修改日期对象

var currentHelsinkiHoursOffset = 2; // sometimes it is 3var date = new Date(1270544790922);var helsenkiOffset = currentHelsinkiHoursOffset*60*60000;var userOffset = _date.getTimezoneOffset()*60000; // [min*60000 = ms]var helsenkiTime = new Date(date.getTime()+ helsenkiOffset + userOffset);// Outputs > Tue Apr 06 2010 12:06:30 GMT-0700 (PDT)

它仍然认为它是GMT-0700(PDT),但是如果您不太凝视,则可能会误认为这是对您有用的日期对象。

我方便地跳过了一部分。您需要能够定义

currentHelsinkiOffset
。如果可以
date.getTimezoneOffset()
在服务器端使用,或者仅使用一些if语句来描述时区更改的时间,那应该可以解决您的问题。

结论 -我认为,为此目的,您尤其应使用类似moment-timezone的日期库。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5111350.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存