js怎么计算两个日期相隔多少年,多少月,多少天(包括平润年 28 29 30 31)

思否 问答 👍 2 含 AI 优化版

问题

js怎么计算两个日期相隔多少年,多少月,多少天(包括平润年 28 29 30 31)

在 SegmentFault 查看原问题 →

由大模型辅助整理,保留原意,优化结构与可读性。

问题概述

提问者希望用 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;否则不用调整。例如 2018090120170902,因为 09-0109-02 小,年数记为 0年;而 2018090220170901,年数记为 1年
  • 月份计算:思路类似,先算月份差,再看日期部分是否需要借位:
    • 2018090120171002:日部分不够减,借位后月数减 1,最终是 0年10月
    • 2018080120171001:同样是 0年10月
    • 2018090120171001:是 0年11月
    • 2018100120171001:整年整月对齐,是 1年0月
    • 2018090220170901:同样是 1年0月
  • 天数计算:原理相同,如果天数不够减,就向月份借位,借位时需要按上一个月实际有多少天(28/29/30/31 天,涉及闰年判断)来计算天数,而不是固定按 30 天处理,这也是这类计算最容易出错的地方。

小结

年月日差值没有唯一标准算法,核心思路是从年到月到日逐级比较、不够减就向上一级借位(借位天数要考虑闰年和每月实际天数),建议先写清楚自己业务需要的进位规则,再逐步实现并用边界日期(比如月末、闰年 2 月)验证输入输出是否符合预期。

由大模型辅助整理,保留原意,补充结构与代码格式。

回答转载自 SegmentFault

评论

评论功能即将开放。你也可以通过 邮件GitHub Issue 反馈。