неверный год в формате moment.js после добавления 3 дней - PullRequest
0 голосов
/ 29 декабря 2018

В javascript я получаю текущий момент и добавляю к нему 3 дня.Почему год, форматируемый как 2019, при добавлении 3-х дней все еще остается 2018?

Это происходит сбой при добавлении в диапазоне от 2дней 11 часов до 3 дней 10 часов.Но работает нормально, если за пределами этого диапазона.

<!DOCTYPE HTML>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script
    src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js">
    </script>
</head>
<body>
<script>
    var targ = moment();
    console.log(targ.format('GGGG-MM-DD HH:mm:ss Z'));
    targ.add(3, 'days');
    console.log(targ.format('GGGG-MM-DD HH:mm:ss Z'));
</script>

</body>
</html>

Console.logs показывают следующее:

2018-12-28 14:39:38 -07: 00

2019-12-31 14:39:38 -07: 00

1 Ответ

0 голосов
/ 29 декабря 2018

GGGG - это год недели ISO, а не фактический год:

moment.js: токены года, недели и дня недели

GGGG: ISO 4-значный недельный год

Википедия: ISO-неделя :

[...] Определение ISO 8601 для недели01 - неделя с первым четвергом григорианского года.[...]

[...] Если 1 января в понедельник, вторник, среду или четверг, это на неделе 01. Если 1 января на пятницу, это часть недели 53предыдущего года.Если это суббота, то это часть последней недели предыдущего года, которая насчитывает 52 в обычном году и 53 в високосном.Если это воскресенье, это часть недели 52 предыдущего года.[...]

[...] Если 31 декабря - понедельник, вторник или среда, то это будет 01 неделя следующего года.Если это четверг, то это на 53 неделе года, который только заканчивается;если в пятницу это на 52 неделе (или 53, если год, который только что закончился, является високосным);если в субботу или в воскресенье, это на 52 неделе года, который только заканчивается.[...]

Таким образом, последние дни года могут принадлежать первой неделе ISO следующего года.

Вы ищете YYYY

var targ = moment();
console.log(targ.format('YYYY-MM-DD HH:mm:ss Z'));
targ.add(3, 'days');
console.log(targ.format('YYYY-MM-DD HH:mm:ss Z'));
...