我必须访问一个我无法修复的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}`;
}
答案 0 :(得分:2)
Unix time的值是自大纪元以来的秒数,不会像您的1556214336.316
这样的小数点
如果我将1556214336
(不带.316
)放到a converter中,则会得到输出04/25/2019 @ 5:45pm (UTC)
,它是 not 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:45 pm”时间完全匹配
var d = new Date(1556214336316);
console.log('Date is: ' + d.toUTCString());
假设您的值1556214336.316
是一个从Web API返回的字符串,则可以删除小数,并且可以像这样完成转换(请注意,您不必继续创建新的Date
对象):
convertDateToTimerFormat = (time) => {
const d = new Date( Number(time.replace(/\./g, '')) );
return `${d.getHours()}:${d.getMinutes()}:${d.getSeconds()}`;
};
console.log( 'time: ' + convertDateToTimerFormat('1556214336.316') );
根据您的使用情况,您可能希望使用getUTCHours()
等。
答案 1 :(得分:0)
我不了解优雅,但这以h:mm:ss
格式计算并显示过期时间:
console.log(convertDateToTimerFormat(1556215236.316));
function convertDateToTimerFormat(time){
// Converts `time` to milliseconds to make a JS Date object, then back to seconds
const expiredSeconds = Math.floor(new Date()/1000) - Math.floor(new Date(time * 1000)/1000);
// Calculates component values
const hours = Math.floor(expiredSeconds / 3600), //3600 seconds in an hour
minutes = Math.floor(expiredSeconds % 3600 / 60),
seconds = expiredSeconds % 3600 % 60;
// Adds initial zeroes if needed
if (minutes < 10) { minutes = "0" + minutes; }
if (seconds < 10) { seconds = "0" + seconds; }
// Returns a formatted string
return `${hours}:${minutes}:${seconds}`;
}