鍍金池/ 問答/HTML/ js前端如何實現(xiàn)根據(jù)兩個日期(例如2018-03-23)來算出其中間間隔幾個月(

js前端如何實現(xiàn)根據(jù)兩個日期(例如2018-03-23)來算出其中間間隔幾個月(月指的是自然月)零幾天?

問題陳述:js前端如何實現(xiàn)根據(jù)兩個日期(例如2018-03-23)來算出其中間間隔幾個月(月指的是自然月)零幾天?
思考場景:就講其中一種場景 計算寶寶出生了幾個月零幾天 出生日期2017-02-23 當前日期 2018-03-23
思考難點: 在其中一種情況下遇到如下問題:
當出生年小于當前年&&出生月小于當前月 出生當月肯定不能算整月 后面的遍歷出生年月(從當月+1)開始 所以就是算剩幾天吧 (計算出整月有多少天然后減去出生天 就是去年零的幾天)當年零的幾天也是這么算。 好從這之前都沒問題 問題難點 是這兩個零幾天如果超過三十天 那怎么累加到之前的月份呢 按照什么條件? 30天一累加? 所以是不是沒有辦法解決?

回答
編輯回答
呆萌傻

前端算其實也比較容易,其實樓上提出來的那個問題不大,如果按月來先減,再看日就不會有他說的那種問題。如果日有30天算一個月,就相對簡單了。

2017年4月29日 04:24
編輯回答
做不到

按年,月,日分別計算即可

2018年9月21日 14:38
編輯回答
愚念

用moment.js

var start = moment('2017-02-23');
var end = moment('2018-03-23');
end.diff(start, 'days'); // 393
2017年12月25日 08:56
編輯回答
詆毀你

這個其實是一個用戶體驗問題,
如果當前月份是非閏年的2月,那么你如果零頭算出來是29,30,客戶就會覺得很奇怪,
如果你當前月份是7月是31天的,你零頭算出來是30,客戶反而會覺得可以接受,
所以你可以根據(jù)當前月份來決定最后28,29,30,31的這些零頭是否要進位。。

2018年6月16日 07:17
編輯回答
汐顏
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))
2018年8月21日 23:23