我有一个遗留的网络应用程序,它将日期存储为UNIX时间戳(自1970年以来的秒数)。通常这样的时间戳表示UTC,但这些时间戳是UTC-8。它看起来不像夏令时(DST)。我可以将它在服务器上转换为UTC并发送给客户端,但我想知道是否只有一个javascript解决方案。
示例输入:
1399335987
示例输出:
"2014-05-05T16:26:27-07:00" // Pacific Daylight Time (PDT)
客户端应根据本地计算机显示日期/时间。我查看了使用momentjs,但我找不到如何从数字构建日期而数字不是UTC。这可能吗?
答案 0 :(得分:3)
是的,鉴于unix时间戳采用UTC格式,Moment Timezone(http://momentjs.com/timezone/)
,这是可能的moment
.unix(1399335987)
.tz('MST')
.format('YYYY-MM-DDTHH:mm:ssZ');
你得到了
"2014-05-05T17:26:27-07:00"
请注意,我使用MST
,您应该能够通过Timezone Data Builder(http://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字符串,而不是时间戳。)