js前端如何实现根据两个日期(例如2018-03-23)来算出其中间间隔几个月零几天?

问题陈述:js前端如何实现根据两个日期(例如2018-03-23)来算出其中间间隔几个月(月指的是自然月)零几天?
思考场景:就讲其中一种场景 计算宝宝出生了几个月零几天 出生日期2017-02-23 当前日期 2018-03-23
思考难点: 在其中一种情况下遇到如下问题:
当出生年小于当前年&&出生月小于当前月 出生当月肯定不能算整月 后面的遍历出生年月(从当月+1)开始 所以就是算剩几天吧 (计算出整月有多少天然后减去出生天 就是去年零的几天)当年零的几天也是这么算。 好从这之前都没问题 问题难点 是这两个零几天如果超过三十天 那怎么累加到之前的月份呢 按照什么条件? 30天一累加? 所以是不是没有办法解决?

蝴蝶不菲
浏览 2345回答 4
4回答

开心每一天1111

用moment.jsvar start = moment('2017-02-23');var end = moment('2018-03-23');end.diff(start, 'days'); // 393

幕布斯7119047

这个其实是一个用户体验问题,如果当前月份是非闰年的2月,那么你如果零头算出来是29,30,客户就会觉得很奇怪,如果你当前月份是7月是31天的,你零头算出来是30,客户反而会觉得可以接受,所以你可以根据当前月份来决定最后28,29,30,31的这些零头是否要进位。。

撒科打诨

前端算其实也比较容易,其实楼上提出来的那个问题不大,如果按月来先减,再看日就不会有他说的那种问题。如果日有30天算一个月,就相对简单了。

叮当猫咪

var mons = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]function isLeapYear(year) {&nbsp; var&nbsp; r = year / 100&nbsp; if (r === parseInt(r)) {&nbsp; &nbsp; r = year / 400&nbsp; &nbsp; return r === parseInt(r)&nbsp; }&nbsp; r = year / 4&nbsp; if (r === parseInt(r)) {&nbsp; &nbsp; return true&nbsp; }&nbsp; return false}function getDaysOfMonth(month, year) {&nbsp; if (month === 2 && isLeapYear(year)) {&nbsp; &nbsp; return 29&nbsp; }&nbsp; return mons[month]}function getMonthsOfYear(year) {&nbsp; if (isLeapYear(year)) {&nbsp; &nbsp; return 366&nbsp; }&nbsp; return 365}function diff(s1, s2) {&nbsp; var arr1 = s1.split('-').map(Number)&nbsp; var arr2 = s2.split('-').map(Number)&nbsp; var [year, month, day] = arr2.map((n, i) => n - arr1[i])&nbsp; if (day < 0) {&nbsp; &nbsp; day += getDaysOfMonth(arr2[1], arr2[0])&nbsp; &nbsp; month--&nbsp; }&nbsp; if (month < 0) {&nbsp; &nbsp; month += getMonthsOfYear(arr2[0])&nbsp; &nbsp; year--&nbsp; }&nbsp; return [year, month, day]}var d1_str = '2017-3-11'var d2_str = '2018-3-26'console.log(diff(d1_str, d2_str))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript