【问题标题】:How to get time difference from ZoneDateTime in javascript如何在javascript中获取与ZoneDdateTime的时差
【发布时间】:2022-02-10 18:11:17
【问题描述】:

如何获取两个日期时间之间的时间差(以秒为单位),一个是来自后端的 ZoneDateTime 形式,另一个是收到响应时前端的当前时间。

来自后端的响应时间是 -

callStartTime:{
chronology: {id: 'ISO', calendarType: 'iso8601'}
dayOfMonth: 8
dayOfWeek: "TUESDAY"
dayOfYear: 39
hour: 16
minute: 15
month: "FEBRUARY"
monthValue: 2
nano: 240000000
offset: {totalSeconds: 19800, id: '+05:30', rules: {…}}
second: 29
year: 2022
zone: {id: 'Asia/Calcutta', rules: {…}}

从这里我怎样才能找到当前时间和这个时间之间的差异(以秒为单位)?

【问题讨论】:

  • 你试过这个库吗? github.com/js-joda/js-joda
  • 没有,我没试过,需要用库吗?我不能通过减去分钟和秒来做到吗?
  • 可以,但您需要额外的时区逻辑、格式化输出等。我会在重新发明轮子之前尝试使用库。

标签: javascript angularjs datetime


【解决方案1】:

根据数据计算等效的 ECMAScript 时间值。从当前时间值中减去它,你就有毫秒的差异,例如

function getTimeDiff(data, date = new Date()) {
  let utc = new Date(Date.UTC(
      data.year, 
      data.monthValue - 1,
      data.dayOfMonth,
      data.hour,
      data.minute,
      data.second
  ) - data.offset.totalSeconds*1e3);
  return date - utc;
}

function msToTime(ms) {
  let days = ms / 8.64e7 | 0;
  let hrs = (ms%8.64e7) / 3.6e6 | 0;
  let mins = (ms%3.6e6) / 6e4 | 0;
  let secs = (ms%6e4) / 1e3 | 0;
  let z = n => (n<10? '0':'') + n;
  return `${days? days + ' day' + (days == 1? ' ' : 's ') : ''}${z(hrs)}:` +
         `${z(mins)}:${z(secs)}`;
}

let callStartTime = {
  chronology: {id: 'ISO', calendarType: 'iso8601'},
  dayOfMonth: 8,
  dayOfWeek: "TUESDAY",
  dayOfYear: 39,
  hour: 16,
  minute: 15,
  month: "FEBRUARY",
  monthValue: 2,
  nano: 240000000,
  offset: {totalSeconds: 19800, id: '+05:30', rules: {}},
  second: 29,
  year: 2022,
  zone: {id: 'Asia/Calcutta', rules: {}}
};

['2022-02-08T16:15:29+05:30', // 0
 null // now
].forEach(ts => {
  let data = callStartTime;
  let compDate = ts? new Date(ts) : new Date();
  let diffMs = getTimeDiff(data, compDate);
  console.log(`${ts || compDate.toISOString()} : ` +
              `${diffMs} ms (${msToTime(diffMs)})`
  );
});

【讨论】:

  • 谢谢,你能解释一下为什么你有foreach循环吗?我应该在那里度过当前时间吗?
  • forEach 循环仅用于运行一些示例。要比较的默认日期是当前日期(即,如果没有日期过去,则使用“现在”)。
猜你喜欢
  • 1970-01-01
  • 2010-11-28
  • 2022-10-12
  • 2019-03-12
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多