在JS应用程序中,我从服务器(Ajax)接收时间戳(eq.1270544790922
)。
基于该时间戳,我使用以下命令创建Date
对象:
var _date = new Date();
_date.setTime(1270544790922);
现在,_date
解码了当前用户区域设置时区的时间戳。我不希望这样。
我想使用_date
将此时间戳转换为欧洲赫尔辛基市的当前时间(不考虑用户的当前时区)。
我该怎么做呢?
在JS应用程序中,我从服务器(Ajax)接收时间戳(eq.1270544790922
)。
基于该时间戳,我使用以下命令创建Date
对象:
var _date = new Date();
_date.setTime(1270544790922);
现在,_date
解码了当前用户区域设置时区的时间戳。我不希望这样。
我想使用_date
将此时间戳转换为欧洲赫尔辛基市的当前时间(不考虑用户的当前时区)。
我该怎么做呢?
8条答案
按热度按时间yeotifhr1#
Date对象的底层值实际上是UTC。为了证明这一点,请注意,如果您键入
new Date(0)
,您将看到如下内容:Wed Dec 31 1969 16:00:00 GMT-0800 (PST)
.0在GMT中被视为0,但.toString()
方法显示的是本地时间。注意,UTC代表 * 通用 * 时间代码。2个不同地方的当前时间是相同的UTC,但是输出可以有不同的格式。
我们需要的是一些格式
这是可行的,但是...你不能真正使用任何其他的日期方法,因为它们描述了用户的时区。你想要的是一个与赫尔辛基时区相关的日期对象。在这一点上你的选择是使用一些第三方库(我推荐这样做),或者修改日期对象,这样你就可以使用它的大多数方法。
选项1 -第三方,如moment-timezone
这看起来比我们接下来要做的要优雅得多。
选项2 -黑出日期对象
它仍然认为它是GMT-0700(PDT),但是如果你不盯着看太久,你可能会把它误认为是一个日期对象,这对你的目的很有用。
我很方便地跳过了一个部分。您需要能够定义
currentHelsinkiOffset
。如果您可以在服务器端使用date.getTimezoneOffset()
,或者只是使用一些if语句来描述时区更改发生的时间,那么应该可以解决您的问题。结论-我认为,特别是在这种情况下,您应该使用像moment-timezone这样的日期库。
xt0899hw2#
要考虑毫秒数和用户的时区,请使用以下命令:
3phpmpom3#
只是另一种方法
干杯!
qzlgjiam4#
我怀疑Answer没有给予正确的结果。在这个问题中,提问者想将服务器上的时间戳转换为赫尔辛基的当前时间,而不考虑用户的当前时区。
这是一个事实,用户的时区可以是什么,所以我们不能相信它。
例如,如果时间戳为1270544790922,我们有一个函数:
当纽约人访问该页面时,alert(_helsenkiTime)将打印:
当芬兰人访问该页面时,alert(_helsenkiTime)会打印:
因此,只有当页面访问者的计算机中有目标时区(欧洲/赫尔辛基)时,该函数才是正确的,但在世界上几乎所有其他地方都是错误的。而且,由于服务器时间戳通常是UNIX时间戳,根据UTC的定义,它是从Unix纪元(1970年1月1日00:00:00 GMT)以来的秒数,我们无法根据时间戳确定DST或非DST。
因此解决方案是不考虑用户的当前时区,并实现某种方法来计算UTC偏移,无论日期是否在DST。Javascript没有本地方法来确定用户当前时区以外的其他时区的DST转换历史。我们可以使用服务器端脚本最简单地实现这一点,因为我们可以轻松访问服务器的时区数据库,其中包含所有时区的整个转换历史。
但是,如果您无法访问服务器(或任何其他服务器)的时区数据库,并且时间戳是UTC格式的,则可以通过在Javascript中硬编码DST规则来获得类似的功能。
要覆盖欧洲/赫尔辛基1998 - 2099年的日期,可以使用以下函数(jsfiddled):
用法示例:
这将打印以下内容,而不考虑用户时区:
当然,如果你可以返回一个格式的时间戳,偏移量(DST或非DST)已经添加到服务器上的时间戳,你不必计算它的客户端,你可以简化函数很多.但记住不要使用timezoneOffset(),因为这样你就必须处理用户时区,这不是想要的行为.
hfyxw5xn5#
假设您获得的时间戳是赫尔辛基时间,我将创建一个日期对象,设置为1970年1月1日午夜UTC(为了忽略浏览器的本地时区设置),然后添加所需的毫秒数。
以后要注意,总是从日期对象中询问UTC值。这样,无论本地设置如何,用户都将看到相同的日期值。否则,日期值将根据本地时间设置而移动。
zvokhttg6#
我的解决方案是确定浏览器应用的时区调整,然后反向调整:
这一点的日期将是时区自由和始终UTC,您可以应用自己的偏移时间戳产生任何时区。
j8ag8udp7#
使用此函数并在以后 * 始终 * 使用UTC函数,例如
mydate.getUTCHours();
ou6hu8tu8#
解决这个问题的唯一方法是从字符串中删除时区和毫秒信息。