javascript - 在添加 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
解决方案
GGGG
是 ISO 周的年份,而不是实际年份:
GGGG:ISO 4 位数周年
[...] 第 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'));
推荐阅读
- python - pytorch 中的自适应池化如何工作?
- rust - 如何在不制作任何副本的情况下将 bytes::Bytes 转换为 &str?
- python - python字节数组print()给出错误的值
- c - 我自己的 malloc() 函数中的指针算术问题
- azure - 如何捕获 azure 的限制异常?
- excel - 图表对象的粘贴方法在 Excel 2016 中无法按预期工作
- c# - 如何从arduino检索值到asp.net
- optimization - Dart 2 中的最佳渲染循环是什么?
- postgresql - 使用 SQLX 转到可选字段
- apache-spark - Spark Kafka 在 spark 2.3.0 中使用 python 流式传输