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

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

阅读 6.2k
5 个回答

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

用moment.js

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

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

新手上路,请多包涵

按年,月,日分别计算即可

var mons = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

function isLeapYear(year) {
  var  r = year / 100
  if (r === parseInt(r)) {
    r = year / 400
    return r === parseInt(r)
  }
  r = year / 4
  if (r === parseInt(r)) {
    return true
  }
  return false
}

function getDaysOfMonth(month, year) {
  if (month === 2 && isLeapYear(year)) {
    return 29
  }
  return mons[month]
}

function getMonthsOfYear(year) {
  if (isLeapYear(year)) {
    return 366
  }
  return 365
}

function diff(s1, s2) {
  var arr1 = s1.split('-').map(Number)
  var arr2 = s2.split('-').map(Number)
  var [year, month, day] = arr2.map((n, i) => n - arr1[i])
  if (day < 0) {
    day += getDaysOfMonth(arr2[1], arr2[0])
    month--
  }
  if (month < 0) {
    month += getMonthsOfYear(arr2[0])
    year--
  }
  return [year, month, day]
}
var d1_str = '2017-3-11'
var d2_str = '2018-3-26'
console.log(diff(d1_str, d2_str))
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题