Как рассчитать разницу между датами с 12:00 до 12:00? - PullRequest
0 голосов
/ 07 июня 2019

Я должен рассчитать разницу между двумя выбранными датами. Начало дня считается 12:00, а окончание дня - следующие 12:00.

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 ]

1 голос
/ 07 июня 2019

Похоже, вы хотите посчитать любую часть дня за полный день?

Попробуйте установить время первой даты на 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 голос
/ 08 июня 2019

Если ваши метки времени и «дни» всегда в формате UTC, вы можете установить время в 00:00:00 UTC, получить разницу в днях и добавить единицу. В 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));
0 голосов
/ 07 июня 2019

Если начало дня и время окончания дня совпадают, то последний день не будет засчитан.

То, что вам действительно нужно, это время окончания дня в 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...