在一个JS应用程序中,我1270544790922从服务器(Ajax)收到时间戳(等价)。
1270544790922
基于该时间戳,我Date使用以下对象创建对象:
Date
var _date = new Date(); _date.setTime(1270544790922);
现在,_date解码当前用户区域设置时区中的时间戳。我不要
_date
我想_ date将这个时间戳转换为欧洲赫尔辛基市的当前时间(不考虑用户的当前时区)。
date
我怎样才能做到这一点?
Date对象的基础值实际上是UTC。为了证明这一点,请注意,如果您键入内容new Date(0),则会看到类似:的信息Wed Dec 31 196916:00:00 GMT-0800 (PST)。GMT中将0视为0,但.toString()方法显示本地时间。
new Date(0)
Wed Dec 31 196916: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"
这行得通,但是…您不能真正将其他任何日期方法用于您的目的,因为它们描述了用户的时区。您需要的是与赫尔辛基时区相关的日期对象。此时,您的选择是使用某些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语句来描述时区更改的时间,那应该可以解决您的问题。
currentHelsinkiOffset
date.getTimezoneOffset()
结论 -我认为,为此目的,您尤其应使用类似moment-timezone的日期库。