首页 > 解决方案 > 在添加 3 天后,moment.js 格式错误的年份

问题描述

在 javascript 中,我得到当前时刻,并添加 3 天。为什么加了 3 天还是 2018 年被格式化为 2019 年?

从 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

标签: javascriptmomentjs

解决方案


GGGG是 ISO 周的年份,而不是实际年份:

moment.js:周年、周和工作日标记

GGGG:ISO 4 位数周年

维基百科:ISO 星期日期

[...] 第 1 周的 ISO 8601 定义是包含公历年第一个星期四的那一周。[...]

[...] 如果 1 月 1 日在星期一、星期二、星期三或星期四,则为第 01 周。如果 1 月 1 日在星期五,则为上一年第 53 周的一部分。如果是在星期六,则它是上一年最后一周的一部分,在平年编号为 52,在闰年编号为 53。如果是在星期日,则它是上一年第 52 周的一部分。[...]

[...] 如果 12 月 31 日是星期一、星期二或星期三,则它是在下一年的第 1 周。如果是星期四,则在刚刚结束的一年的第 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'));

推荐阅读