angular2时间戳转换:参数2的秒值结果与毫秒展开

输入参数2做angular2时间戳转换,结果是Unix秒值2、毫秒值2000、ISO时间1970-01-01T00:00:02.000Z、UTC时间1970-01-01 00:00:02。这个结果说明参数2被当作秒级时间戳处理,而不是毫秒值。

在线工具时间戳转换

参数2的四个输出字段怎么读

把2传进去,工具先把它当作Unix时间戳的秒数,于是unix字段原样保留为2。毫秒字段是秒数乘以1000,得到2000。ISO字段把2000毫秒换算成UTC时刻,写作1970-01-01T00:00:02.000Z,末尾的Z表示零时区。UTC字段则是去掉T和毫秒的展示形式:1970-01-01 00:00:02。四个字段其实在说同一件事,只是单位与格式不同:秒、毫秒、带时区标记的ISO串、便于阅读的UTC串。

从参数2逐步推到可读时间

第一步确认输入2是秒级,不是毫秒级;若把它误当毫秒,结果会落在1970-01-01T00:00:00.002Z,与证据给出的秒级解释不一致。第二步做单位换算:2秒×1000=2000毫秒。第三步把2000毫秒放到Unix纪元1970-01-01T00:00:00Z之上累加,得到1970-01-01T00:00:02.000Z。第四步按UTC格式去掉毫秒与T,写成1970-01-01 00:00:02。整个过程没有时区偏移参与,因为ISO与UTC字段都按零时区输出。

把2和1、3、662、3602放在一起看

参数1得到1970-01-01T00:00:01.000Z,参数3得到1970-01-01T00:00:03.000Z,参数2正好夹在中间,说明秒值每加1,ISO串的秒位就加1。参数662对应1970-01-01T00:11:02.000Z,因为662秒等于11分2秒;参数3602对应1970-01-01T01:00:02.000Z,因为3602秒等于1小时2秒。这几个相邻值放在一起,能直观看出秒值如何进位到分和时。

负参数与零附近的边界对照

证据里还有负值:-658对应1969-12-31T23:49:02.000Z,-3598对应1969-12-31T23:00:02.000Z。它们都落在1970年之前,说明秒级时间戳允许负数,表示纪元之前的时刻。参数0在参考里出现,对应纪元起点1970-01-01T00:00:00Z。把2和这些值对照,可以确认工具对秒值的处理是线性的:正数往后走,负数往前走,零停在起点。

在Angular项目里什么时候会碰到参数2这类值

后端接口有时返回秒级时间戳,前端拿到2这样的数值,直接丢给new Date(2)会得到1970-01-01T00:00:00.002Z,和预期差了一千倍。这时需要先判断单位:如果数值在十位以内,多半是秒;如果到了十三位,才是毫秒。判断清楚后再做angular2时间戳转换,或者用时间戳转换核对秒值与毫秒值的对应关系。对2这类小数值,乘以1000再交给日期对象,就能得到1970-01-01T00:00:02.000Z。

总结

参数2的angular2时间戳转换结果是Unix秒值2、毫秒值2000、ISO时间1970-01-01T00:00:02.000Z、UTC时间1970-01-01 00:00:02;它说明小数值应按秒级处理,乘以1000后再交给日期对象。

相关文章

常见问题

Q1参数2转换后为什么是1970年而不是别的年份?

因为2被当作Unix纪元之后的第2秒,纪元起点是1970-01-01T00:00:00Z,加2秒就是1970-01-01T00:00:02.000Z。

Q2参数2的毫秒值2000是怎么来的?

秒值2乘以1000得到2000毫秒,证据里毫秒字段正是2000,ISO串末尾也写作.000。

Q3参数2和参数3的结果差在哪里?

参数2对应1970-01-01T00:00:02.000Z,参数3对应1970-01-01T00:00:03.000Z,只差ISO串秒位上的1秒。

Q4负参数-658的结果和参数2有什么可比性?

-658落在1969-12-31T23:49:02.000Z,在纪元之前;参数2落在纪元之后2秒,两者方向相反,但都按秒值线性换算。