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

2022-08-30 05:19:00

在JS应用程序中,我从服务器(Ajax)接收时间戳(等式)。1270544790922

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

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

现在,在当前用户区域设置时区中解码了时间戳。我不想那样。_date

我想_将此时间戳转换为欧洲赫尔辛基市的当前时间(忽略用户的当前时区)。date

我该怎么做?


答案 1

Date 对象的基础值实际上是 UTC 格式。为了证明这一点,请注意,如果键入,您将看到类似以下内容的内容:。0 在 GMT 中被视为 0,但方法显示本地时间。new Date(0)Wed Dec 31 1969 16:00:00 GMT-0800 (PST).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"

这有效,但是....您不能真正使用任何其他日期方法来实现您的目的,因为它们描述了用户的时区。您需要的是与赫尔辛基时区相关的日期对象。此时,您的选择是使用一些第三方库(我推荐这个),或者破解日期对象,以便您可以使用其大多数方法。

选项 1 - 像时刻时区这样的第三方

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),但如果你不盯着太用力,你可能会把它误认为是一个对你的目的有用的日期对象。

我方便地跳过了一个部分。您需要能够定义 .如果您可以在服务器端使用,或者只是使用一些if语句来描述时区何时发生更改,那应该可以解决您的问题。currentHelsinkiOffsetdate.getTimezoneOffset()

结论 - 我认为特别是为此目的,您应该使用像时刻时区这样的日期库。


答案 2

若要考虑毫秒和用户的时区,请使用以下命令:

var _userOffset = _date.getTimezoneOffset()*60*1000; // user's offset time
var _centralOffset = 6*60*60*1000; // 6 for central time - use whatever you need
_date = new Date(_date.getTime() - _userOffset + _centralOffset); // redefine variable