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语句来描述时区何时发生更改,那应该可以解决您的问题。currentHelsinkiOffset
date.getTimezoneOffset()
结论 - 我认为特别是为此目的,您应该使用像时刻时区这样的日期库。