如何忽略用户的时区并强制Date()使用特定的时区
在一个JS应用程序中,我1270544790922
从服务器(Ajax)收到时间戳(等价)。
基于该时间戳,我Date
使用以下对象创建对象:
var _date = new Date();_date.setTime(1270544790922);
现在,_date
解码当前用户区域设置时区中的时间戳。我不要
我想_ 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对象,以便您可以使用大多数方法。
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
这看起来比我们接下来要做的要优雅得多。
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的日期库。
以上是 如何忽略用户的时区并强制Date()使用特定的时区 的全部内容, 来源链接: utcz.com/qa/417904.html