一尘不染

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

javascript

在一个JS应用程序中,我1270544790922从服务器(Ajax)收到时间戳(等价)。

基于该时间戳,我Date使用以下对象创建对象:

var _date = new Date();
_date.setTime(1270544790922);

现在,_date解码当前用户区域设置时区中的时间戳。我不要

我想_ date将这个时间戳转换为欧洲赫尔辛基市的当前时间(不考虑用户的当前时区)。

我怎样才能做到这一点?


阅读 512

收藏
2020-05-01

共1个答案

一尘不染

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:30
moment(1270544790922).tz('Europe/Helsinki').hour()
// outputs > 12

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

选项2-修改日期对象

var currentHelsinkiHoursOffset = 2; // sometimes it is 3
var 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的日期库。

2020-05-01