我必须使用一个我无法修复的 API,并且我需要启动一个计时器来显示某人在队列中等待了多长时间。我返回的日期采用以下格式 1556214336.316
。问题是年份始终显示为 1970,但时间是正确的开始时间。我需要计算现在的时间与创建对话的时间之间的差异。我尝试过这一点,但收效甚微,并且想知道是否有一种优雅的方法可以只获取时间差异而不是总秒数。
convertDateToTimerFormat = (time) => {
const now = new Date();
const diff = Math.round((now - parseInt(time.toString().replace('.', ''))) / 1000);
const hours = new Date(diff).getHours();
const minutes = new Date(diff).getMinutes();
const seconds = new Date(diff).getSeconds();
return `${hours}:${minutes}:${seconds}`;
}
奇怪的 parseInt(time.toString().replace('.', '')))
似乎解决了 1970 年的问题,但我仍然无法获取要操作的数据我需要什么。
我尝试了 momentjs 库,但他们的 diff 方法似乎只允许几天和几小时。
任何帮助/指导,我们将不胜感激。
使用工作代码进行编辑:
convertDateToTimerFormat = (time) => {
const now = new Date();
// eslint-disable-next-line radix
const diff = new Date(Number(now - parseInt(time.toString().replace(/\./g, ''))));
const hours = diff.getHours();
const minutes = diff.getMinutes();
const seconds = diff.getSeconds();
return `${hours}:${minutes}:${seconds}`;
}
最佳答案
Unix time值是自纪元以来的秒数,并且不会像1556214336.316
那样带有小数
如果我将 1556214336
(不带 .316
)放入 a converter我得到的输出 04/25/2019 @ 5:45pm (UTC)
不是 1970 年 - 这似乎是一个准确的时间(我尚未独立验证)
那么,您的 1556214336.316
似乎是自纪元以来的秒。毫秒。
Javascript使用相同的纪元,但是是自纪元以来的毫秒数,而不是秒,所以如果我对你得到的时间是正确的应该能够删除小数位并使用结果数字字符串。确实如此
var d = new Date(1556214336316);
console.log('Date is: ' + d.toUTCString());
产生
Date is: Thu, 25 Apr 2019 17:45:36 GMT
与转换器的时间“5:45pm”完全匹配
var d = new Date(1556214336316);
console.log('Date is: ' + d.toUTCString());
假设您的值 1556214336.316
是从 Web API 返回的字符串,您可以删除小数点,并且可以像这样完成转换(请注意,您不必继续创建新的 日期
对象):
convertDateToTimerFormat = (time) => {
const d = new Date( Number(time.replace(/\./g, '')) );
return `${d.getHours()}:${d.getMinutes()}:${d.getSeconds()}`;
};
console.log( 'time: ' + convertDateToTimerFormat('1556214336.316') );
根据您的使用情况,您可能需要使用 getUTCHours()
等。
关于javascript - 处理年份错误但时间正确的日期字符串的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55856174/