js怎么计算两个日期相隔多少年,多少月,多少天(包括平润年 28 29 30 31)
问题
js怎么计算两个日期相隔多少年,多少月,多少天(包括平润年 28 29 30 31)
由大模型辅助整理,保留原意,优化结构与可读性。
问题概述
提问者希望用 JavaScript 计算两个日期之间相隔的年数、月数、天数(类似“x年x月x天”的格式),并且需要正确处理每月天数不同、平年/闰年天数不同等边界情况。
涉及技术
JavaScript、日期处理
期望结果
得到一种可行的年/月/日差值计算逻辑(或思路),并能通过具体示例验证输入输出是否符合预期。
回答
原始回答
这个东西看你这么认为了。
你是想要 1年2个月3天这种的。还是想要 一年 14个月 4天**。
这个东西没有一个标准算法。如果你有你心中的逻辑,按逻辑一点一点写出来。
可以发出来让别人帮你优化,抖机灵什么的。还能看看输入输出一样不。
我的想法是年-年,然后看看时间大还是小,小的话,减去-1,大的话不动
20180901 20170902 这种就是0年
20180902 20170901 这种就是1年
月-月,看看时间是大是小,这个也要看时间再去处理
20180901 20171002 这种就是0年10月
20180801 20171001 这种就是0年10月
20180901 20171001 这种就是0年11月
20181001 20171001 这种就是1年0月
20180902 20170901 这种就是1年0月
天数当然也是同样的道理
AI 优化 · 回答整理
解答思路
计算“相差 x 年 x 月 x 天”并没有一个官方的标准算法,因为不同的业务场景对进位规则的理解不完全一致;作者给出的思路是:先比较年份,再看月/日是否需要借位调整,逐级从大单位到小单位处理,遇到不够减的情况就向上一级借位(类似列竖式减法)。
详细说明
- 年份计算:先用“结束年 - 起始年”得到粗略年数,再比较月/日部分:如果结束日期的月日部分比起始日期小(还没到对应的月日),说明整年数还没走完一年,需要减 1;否则不用调整。例如
20180901减20170902,因为09-01比09-02小,年数记为0年;而20180902减20170901,年数记为1年。 - 月份计算:思路类似,先算月份差,再看日期部分是否需要借位:
20180901减20171002:日部分不够减,借位后月数减 1,最终是0年10月。20180801减20171001:同样是0年10月。20180901减20171001:是0年11月。20181001减20171001:整年整月对齐,是1年0月。20180902减20170901:同样是1年0月。
- 天数计算:原理相同,如果天数不够减,就向月份借位,借位时需要按上一个月实际有多少天(28/29/30/31 天,涉及闰年判断)来计算天数,而不是固定按 30 天处理,这也是这类计算最容易出错的地方。
小结
年月日差值没有唯一标准算法,核心思路是从年到月到日逐级比较、不够减就向上一级借位(借位天数要考虑闰年和每月实际天数),建议先写清楚自己业务需要的进位规则,再逐步实现并用边界日期(比如月末、闰年 2 月)验证输入输出是否符合预期。
由大模型辅助整理,保留原意,补充结构与代码格式。
回答转载自 SegmentFault