正确的方法以错误的年份操作日期字符串,但时间正确

时间:2019-04-25 19:13:06

标签: javascript reactjs date

我必须访问一个我无法修复的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}`;
  }

2 个答案:

答案 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}`;
}