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

Javascript 操作日期字符串的正确方法,年份错误,但时间正确,javascript,reactjs,date,Javascript,Reactjs,Date,我必须点击一个我无法修复的API,我需要启动一个计时器,显示某人在队列中已经等待了多长时间。我返回的日期是这种格式的1556214336.316。问题是年份总是显示为1970年,但时间是正确的开始时间。我需要计算现在的时间与创建对话的时间之间的差异。我尝试过这个方法,但收效甚微,我想知道是否有一种优雅的方法可以只获得时间上的差异,而不是总的秒数 convertDateToTimerFormat = (time) => { const now = new Date(); c

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

我不知道优雅,但它以
h:mm:ss
格式计算并显示过期时间:

console.log(convertDateToTimerFormat(1556215236.316));
函数convertDateToTimerFormat(时间){
//将'time'转换为毫秒以生成JS日期对象,然后再转换回秒
const expiredSeconds=Math.floor(新日期()/1000)-Math.floor(新日期(时间*1000)/1000);
//计算组件值
const hours=Math.floor(expiredSeconds/3600),//一小时内3600秒
分钟=数学下限(过期秒数%3600/60),
秒=过期秒数%3600%60;
//如果需要,添加初始零
如果(分钟<10){minutes=“0”+分钟;}
如果(秒<10){seconds=“0”+秒;}
//返回格式化的字符串
返回`${hours}:${minutes}:${seconds}`;

}
我不知道优雅,但它以
h:mm:ss
格式计算并显示过期时间:

console.log(convertDateToTimerFormat(1556215236.316));
函数convertDateToTimerFormat(时间){
//将'time'转换为毫秒以生成JS日期对象,然后再转换回秒
const expiredSeconds=Math.floor(新日期()/1000)-Math.floor(新日期(时间*1000)/1000);
//计算组件值
const hours=Math.floor(expiredSeconds/3600),//一小时内3600秒
分钟=数学下限(过期秒数%3600/60),
秒=过期秒数%3600%60;
//如果需要,添加初始零
如果(分钟<10){minutes=“0”+分钟;}
如果(秒<10){seconds=“0”+秒;}
//返回格式化的字符串
返回`${hours}:${minutes}:${seconds}`;
}
值是从纪元开始的秒数,不会像您的
1556214336.316

如果我把
1556214336
(没有
.316
)放进去,我会得到输出
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:45”时间完全匹配

var d=新日期(1556214336316);
log('日期为:'+d.toutString())值是自纪元以来的秒数,不会像您的
1556214336.316

如果我把
1556214336
(没有
.316
)放进去,我会得到输出
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:45”时间完全匹配

var d=新日期(1556214336316);

log('日期为:'+d.toutString())为什么基数为零?(您甚至不需要解析数字字符串,除非使用加法)这是一个好问题。我想我假设0是默认值?我的林特对我大喊大叫。为什么你的基数是零?(您甚至不需要解析数字字符串,除非使用加法)这是一个好问题。我想我假设0是默认值?我的林特对我大喊大叫,太好了。我还计算了当前时间,并从中减去格式奇怪的日期,以获得一个人排队多长时间的开始时间。不确定你是否在我的代码中看到了。工作就像做梦一样。非常感谢。减去时间,你最好使用时间戳,而不是日期组件;您可以使用
const now=
并减去:
const diff=now-then
(其中“then”是从您收到的文本字符串中派生出来的毫秒,去掉
)。我在阅读了你的答案后编辑了我的帖子,它似乎起了作用。谢谢你的跟进,太好了。我还计算了当前时间,并从中减去格式奇怪的日期,以获得一个人排队多长时间的开始时间。不确定你是否在我的代码中看到了。工作就像做梦一样。非常感谢。减去时间,你最好使用时间戳,而不是日期组件;您可以使用
const now=
并减去:
const diff=now-then
(其中“then”是从您收到的文本字符串中派生出来的毫秒,去掉
)。