在任意时间以任意时区获取日期的当地时间表示 - 考虑夏令时

时间:2014-02-05 23:01:18

标签: javascript date timezone dst

当然,有lot questions Date objects timezones和{{3}}但其中很多都是关于转换当前< / em>到另一个时区的时间,其他时间并不是很清楚他们想要做什么。

我想在任意时间,任意一天显示日,小时,分钟等。例如,我想要一个函数f(t, s)

  • 给定时间戳1357041600(即2013/1/1 12:00:00 UTC)和字符串"America/Los Angeles",将满足以下比较:

    f(1357041600, "America/Los Angeles") == "2013/01/01 04:00:00"
    
  • 鉴于时间戳1372680000(2013/07/01 12:00:00 UTC),将满足以下比较:

    f(1357041600, "America/Los Angeles") == "2013/07/01 05:00:00"
    
  • 即使浏览器中的时区是<{1}}或"Europe/London"
  • 也会始终采用这种方式。

  • 即使浏览器中的时间是这样,
  • 总是会这样,让我们​​说2014/02/05 19:32,或2002/08/04 07:12;以及

  • 作为最终限制,不会从服务器端请求任何内容(因为我自己差不多自己做:) :)

甚至可能吗?

2 个答案:

答案 0 :(得分:1)

  

给出时间戳1357041600(即2013/1/1 12:00:00 UTC)

自UNIX纪元(1970-01-01T00:00:00Z)以来,这似乎是秒。 Javascript使用相同的纪元,但在几毫秒内创建一个合适的日期对象:

var d = new Date(timestamp * 1000);

这将创建一个具有合适时间值的Date对象。然后,您需要使用IANA time zone database之类的内容确定时区偏移量。这可以使用UTC方法应用于Date对象。例如。将偏移量解析为分钟,然后使用:

d.setUTCMinutes(d.getUTCMinutes() + offset)

然后可以使用UTC方法获取调整后的日期和时间值,以便以您需要的任何格式创建字符串:

var dateString = d.getUTCFullYear() + '/' + pad(d.getUTCMonth() + 1) + '/' ...

其中 pad 是将前导零添加到单个数字值的函数。使用UTC方法可避免本地时区偏移和夏令时差异的任何影响。

还有像timezone.js这样的库可以用来确定偏移量,但是我没有使用它们所以没有暗示认可。

答案 1 :(得分:1)

对于支持ECMAScript Internationalization API的JavaScript运行时环境,并遵循其支持IANA time zone database的建议,您只需执行以下操作:

new Date(1357041600000).toLocaleString("en-US", {timeZone: "America/Los_Angeles"})

对于其他环境,需要库。 There are several listed here