如何计算上午12点至凌晨12点之间的日期差?

时间:2019-06-07 10:36:31

标签: javascript date datetime

我必须计算两个选定日期之间的差额。一天的开始时间是凌晨12点,结束的时间是下一个凌晨12点。

JavaScript代码:

const date1 = new Date('2019-06-12T10:30:00Z');
const date2 = new Date('2019-06-14T10:30:00Z');
const diffTime = Math.abs(date2.getTime() - date1.getTime());
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); 
console.log(diffDays);

我得到的差额是2天,这不是我想要的,因为一天是从凌晨12点开始计算的。实际答案应该是3天。需要更改代码中的内容以获得输出 3天?即

1) First Day  : 12 June 10:30am - 13 June 12:00am 
2) Second Day : 13 June 12:00am - 14 June 12:00am 
3) Third Day  : 14 June 12:00am - 14 June 10.30am 

任何帮助将不胜感激..谢谢!

3 个答案:

答案 0 :(得分:1)

您似乎想将一天的任何部分都算作一整天?

尝试将第一个日期的时间设置为00:00:00,将第二个日期的时间设置为23:59:59,这样您的计算就可以了。

const date1 = new Date('2019-06-12T10:30:00Z');
const date2 = new Date('2019-06-14T11:30:00Z');

date1.setSeconds(0);
date1.setMinutes(0);
date1.setHours(0);
date2.setSeconds(59);
date2.setMinutes(59);
date2.setHours(23);

const diffTime = Math.abs(date2.getTime() - date1.getTime());
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); 
alert(`${diffTime} - ${diffDays}`);

答案 1 :(得分:1)

如果您的时间戳记和“天”始终为UTC,则可以将时间设置为UTC 00:00:00 UTC,以天为单位获取时差并加1。在ECMAScript中,UTC时间始终精确地是24小时(忽略秒和夏令时)。

您只需使用内置解析器和日期部分就可以有效地将时间设置为00:00:00,这是由于ECMA-262的古怪之处,ISO 8601格式的日期被视为UTC。但是,我建议改写一个简单的解析器(2或3行),例如

let d0 = '2019-06-12T10:30:00Z';
let d1 = '2019-06-14T11:30:00Z';

/* Get difference in days between two dates.
** @param {string} ts0 - timestamp in format YYYY-MM-DDTHH:mm:ssZ
** @param {string} ts1 - timestamp in format YYYY-MM-DDTHH:mm:ssZ
** @returns {number} difference between timestamps in days, rounded up
*/
function diffDays(ts0, ts1) {
  function qParse(s) {
    let b = s.split(/\D/);
    return new Date(Date.UTC(b[0], b[1]-1, b[2]));
  }
  return (qParse(ts1) - qParse(ts0)) / 8.64e7 + 1;
}

console.log(diffDays(d0, d1));

答案 2 :(得分:0)

如果一天开始时间和一天结束时间都相同,那么最后一天将不被计算。

您真正想要的是第二天的结束时间为上午12:00(如您在问题中所述)。

function countDays(dateA, dateB)
{
  // Day start time is 12:00am
  // 12:00am is represented as 0 hours
  dateA.setHours(0);
  dateA.setMinutes(0);
  dateB.setSeconds(0);

  // Day end time is 12:00am on NEXT day
  // Adding 1 to the date gives the next day
  dateB.setHours(0);
  dateA.setMinutes(0);
  dateB.setSeconds(0);
  dateB.setDate(dateB.getDate() + 1);

  // Compute difference
  const diffTime = dateB.getTime() - dateA.getTime();
  const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));

  return diffDays;
}

JSFiddle:https://jsfiddle.net/cefv4jzp/4/