将带有时区的unix时间戳转换为javascript日期

时间:2014-05-05 23:54:55

标签: javascript datetime

我有一个遗留的网络应用程序,它将日期存储为UNIX时间戳(自1970年以来的秒数)。通常这样的时间戳表示UTC,但这些时间戳是UTC-8。它看起来不像夏令时(DST)。我可以将它在服务器上转换为UTC并发送给客户端,但我想知道是否只有一个javascript解决方案。

示例输入:

1399335987

示例输出:

"2014-05-05T16:26:27-07:00" // Pacific Daylight Time (PDT)

客户端应根据本地计算机显示日期/时间。我查看了使用momentjs,但我找不到如何从数字构建日期而数字不是UTC。这可能吗?

2 个答案:

答案 0 :(得分:3)

是的,鉴于unix时间戳采用UTC格式,Moment Timezonehttp://momentjs.com/timezone/

,这是可能的
moment
  .unix(1399335987)
  .tz('MST')
  .format('YYYY-MM-DDTHH:mm:ssZ');

你得到了

  "2014-05-05T17:26:27-07:00"

请注意,我使用MST,您应该能够通过Timezone Data Builderhttp://momentjs.com/timezone/data/

使用您想要的任何时区

实际上,默认情况下,时刻会以当地时间进行分析和显示。

这意味着,只有当您处于不同的时区(确实是偏移)且仍想在MST中获取当地时间时,才需要将时区设置为MST。

否则,moment.unix(1399335987).format('YYYY-MM-DDTHH:mm:ssZ')就好了。

答案 1 :(得分:2)

如果你完全确定这些值是自1970-01-01 UTC-8以来的秒数,那么只需添加8小时。

var dt = new Date((1399335987 * 1000) + (8 * 60 * 60 * 1000));

或者片刻:

var m = moment.unix(1399335987).add(8, 'hours');
var s = m.format(); // for the ISO output with offset as you requested

但是,您的时间戳将固定为UTC-8,这很奇怪。如果他们是在美国太平洋时区录制的,那么他们将在冬天反映UTC-8,在夏天反映UTC-7。您可以考虑到这一点,除非您可能因任何属于DST回退转换的值而出错,因为重复从1:00:00 - 1:59:59开始的小时。 / p>

另外,作为一般规则 - 根据unix时期发送的数字时间戳是不好的形式。虽然您可以在自己的代码中进行更正,但如果您计划与他人共享数据,那么您应该在服务器上更正它。 (理想情况下,发送一个ISO8601字符串,而不是时间戳。)