为什么不新建Date(ms)==(new Date())。setMilliseconds(ms)

时间:2019-05-09 17:07:39

标签: javascript date

我想将时间戳转换为日期:

  status_transitions:
   { finalized_at: 1557419382,
     marked_uncollectible_at: null,
     paid_at: 1557419384,
     voided_at: null },    

尤其是paid_at: 1557419384。但是,当我尝试new Date(1557419384)时,没有得到预期的结果。如果我使用Date.setMilliseconds(),我会这样做。

Date.setMilliseconds()

的输出尤其奇怪

const ms = 1557419384;

const fromConstructor = new Date(ms);
const fromFn = new Date();
const strangeOutput = fromFn.setMilliseconds(ms);

console.log(`Milliseconds: ${ms}`);

console.log(`Output from setMilliseconds: ${strangeOutput}`);

console.log(`Date from new Date(ms): ${fromConstructor}`);

console.log(`Date using setMilliseconds(ms): ${fromFn}`);

上面的代码输出为:

Milliseconds: 1557419384
Output from setMilliseconds: 1558978824384
Date from new Date(ms): Sun Jan 18 1970 18:36:59 GMT-0600 (Central Standard Time)
Date using setMilliseconds(ms): Mon May 27 2019 12:40:24 GMT-0500 (Central Daylight Time)

为什么从数字创建新日期不会产生与setMilliseconds()相同的结果?另外,为什么setMilliseconds()的输出与传递的实际毫秒数不同?

我已经读过the docs,它们似乎暗示这两种方法之间应该没有区别。

2 个答案:

答案 0 :(得分:2)

请考虑文档heresetMilliseconds()部分中显示的示例。

var theBigDay = new Date();
theBigDay.setMilliseconds(100);

立即运行此命令,这将为我提供值1557421875100。请注意,只有最后三位数字为100。因此,它不会将整个日期对象设置为100,而仅将值的毫秒部分设置为100。其余部分来自new Date(),这是当前基于UTC的时间戳。

至于为什么您没有从new Date(1557419384)得到预期的结果,该时间戳似乎是 seconds ,而不是毫秒。将该值乘以1000,可以得到一个更合理的值。 (Unix timestamps通常用整秒表示,在这里似乎是这种情况。)

答案 1 :(得分:1)

  

为什么setMilliseconds()的输出与传递的实际毫秒数不同?

更仔细地检查文档。 setMilliSeconds有一个“ 参数: 一个介于0到999之间的数字,表示毫秒。”及其描述为“ ”。如果您指定的数字超出预期范围,则Date对象中的日期信息将相应地更新。例如,如果您指定1005,则秒数将增加1,并且5表示毫秒。“。

因此new Date()用当前时间创建一个日期,然后在其中添加毫秒值。

  

为什么用数字创建新日期不会产生与setMilliseconds()相同的结果?   我已经阅读了文档,它们似乎暗示这两种方法之间应该没有区别。

您要寻找的是setTimenew Date().setTime(millseconds)创建一个等于new Date(milliseconds)的对象。

  

当我尝试new Date(1557419384)时,没有得到预期的结果。

正如马特·约翰逊(Matt Johnson)所说,该值似乎是秒而不是毫秒。乘以1000。