Получить продолжительность (в часах и минутах) между двумя объектами Date - JavaScript - PullRequest
0 голосов
/ 18 октября 2018

Хотя я видел несколько похожих вопросов здесь, на SO, но ни один из них не мог помочь мне понять, что не так с моими вычислениями.Я знаю, что могу использовать библиотеку, такую ​​как Moment.JS , чтобы упростить свое решение, но я хочу использовать решение только для JavaScript.

Я пытаюсь рассчитать продолжительность (в часах и минутах) между двумяДата объекты, но я получаю отрицательную (неправильную) продолжительность.

function padNumber(number, width = 2, padWith = '0') {
    const strNum = number.toString();
    return strNum.length >= width ? strNum : new Array(width - strNum.length + 1).join(padWith) + strNum;
}

// Get UTC date time from PHP date (Y-m-d) and time (H:i:s) strings
function getUTCDateTime(date, time, timezoneOffset = -480) {
    const dateParts = date.split('-').map((el) => Number(el)); // Y-m-d
    const timeParts = time.split(':').map((el) => Number(el)); // H:i:s
    const dateTimeUTC = new Date(Date.UTC(dateParts[0], dateParts[1], dateParts[2], timeParts[0], timeParts[1], timeParts[2]));
    // Set back Singapore specific time (GMT+8:00)
    dateTimeUTC.setUTCHours(dateTimeUTC.getUTCHours() + timezoneOffset / 60);
    return dateTimeUTC;
}

function getDuration(timeStart, timeEnd = new Date()) {
    const msDiff = timeEnd.getTime() - timeStart.getTime();
    const minDiff = msDiff / 60000;
    const hourDiff = Math.floor(msDiff / 3600000);
    return {
        hours: this.padNumber(hourDiff, 2),
        minutes: this.padNumber(Math.floor(minDiff - 60 * hourDiff), 2)
    };
}

// Got from server (in Singapore timezone)
const serverDate = '2018-10-18';
const serverTime = '00:22:51';

// Convert server date and time (timezone specific) strings to Date object
const serverUTC = getUTCDateTime(serverDate, serverTime);

// Get duration between server time and now
const duration = getDuration(serverUTC);

// Expected positive value but getting negative as server time is in past
console.log(duration);

Я ожидал положительного значения в журнале консоли, но получаю отрицательное значение.Я что-то пропустил?

1 Ответ

0 голосов
/ 18 октября 2018

Проблема связана с тем, что в JavaScript месяцы начинаются с нуля (т. Е. Январь равен 0, февраль равен 1 и т. Д.).Ваша конструкция даты в getUTCDateTime() не учитывает это.

Эта строка:

const dateTimeUTC = new Date(Date.UTC(dateParts[0], dateParts[1], dateParts[2], timeParts[0], timeParts[1], timeParts[2]));

Должна быть:

const dateTimeUTC = new Date(Date.UTC(dateParts[0], dateParts[1] - 1, dateParts[2], timeParts[0], timeParts[1], timeParts[2]));

Полный фрагмент:

function padNumber(number, width = 2, padWith = '0') {
    const strNum = number.toString();
    return strNum.length >= width ? strNum : new Array(width - strNum.length + 1).join(padWith) + strNum;
}

// Get UTC date time from PHP date (Y-m-d) and time (H:i:s) strings
function getUTCDateTime(date, time, timezoneOffset = -480) {
    const dateParts = date.split('-').map((el) => Number(el)); // Y-m-d
    const timeParts = time.split(':').map((el) => Number(el)); // H:i:s
    const dateTimeUTC = new Date(Date.UTC(dateParts[0], dateParts[1] - 1, dateParts[2], timeParts[0], timeParts[1], timeParts[2]));
    // Set back Singapore specific time (GMT+8:00)
    dateTimeUTC.setUTCHours(dateTimeUTC.getUTCHours() + timezoneOffset / 60);
    return dateTimeUTC;
}

function getDuration(timeStart, timeEnd = new Date()) {
    const msDiff = timeEnd.getTime() - timeStart.getTime();
    const minDiff = msDiff / 60000;
    const hourDiff = Math.floor(msDiff / 3600000);
    return {
        hours: this.padNumber(hourDiff, 2),
        minutes: this.padNumber(Math.floor(minDiff - 60 * hourDiff), 2)
    };
}

// Got from server (in Singapore timezone)
const serverDate = '2018-10-18';
const serverTime = '00:22:51';

// Convert server date and time (timezone specific) strings to Date object
const serverUTC = getUTCDateTime(serverDate, serverTime);

// Get duration between server time and now
const duration = getDuration(serverUTC);

// Expected positive value but getting negative as server time is in past
console.log(duration);
...