面試題:JS 獲取某月的天數

獲取某個月的天數,這個題通常都是在學 switch(){} 一章的案例。面試

咱們一直解題的方案是根據一個順口溜一三五七八十臘,31天永不差,四六九十一,每個月30天,唯有二月二十八,閏年要把日加一。(我搜的,具體怎麼揹我忘了app

這裏面還有個閏年的計算規則:四年一閏,百年不閏,四百年再閏。能夠被4整除,可是不能被100整除,除非能夠被400整除測試

image.png

是否是被上面的魔性概念征服了?接來下咱們來實現一下spa

面試題:JS 獲取某月的天數

先上測試用例

function getMonthCountDay(year, month){
    // year 爲年份,month 爲月份
}
[[2000,2],[2000,1],[2000,3],[2000,4],[2100,2],[2100,1],[2100,3],[2100,4],[2104,2],[2104,1],[2104,3],[2104,4],[2105,2],[2105,1],[2105,3],[2105,4],].map(v=>`${v} => ${getMonthCountDay.apply(null,v)}天`)

基礎版本

根據咱們的順口溜咱們來寫一下3d

function getMonthCountDay (year, month) {
  switch (month){
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        return 31
    case 4:
    case 6:
    case 9:
    case 11:
        return 30
    case 2:
        return year%400==0?(29):(year%4!=0||year%100==0?28:29)
  }
}

很好寫完了,除了代碼看上去多了點,沒別的毛病。code

測試截圖

image.png

藉助 Date API 處理日期溢出特性(進位)

接下來就開始騷了blog

function getMonthCountDay (year, month) {
  return 32 - new Date(year, month-1, 32).getDate()
}

是否是想不到,這種方法寫的一下就不多了。utf-8

image.png

測試截圖

image.png

方案原理

js 中 Date 在處理時間的時候會作進位退位操做get

image.png

藉助 Date API 處理日期溢出特性(退位方案)

剛纔是用的進位,而後減去多餘的。如今咱們改用退位input

function getMonthCountDay (year, month) {
  return new Date(year, month, 0).getDate()
}

image.png

測試截圖

image.png

方案原理

js 中 Date 在處理時間的時候會作進位退位操做

image.png

利用這個特性還能夠作什麼?

image.png

獲取月初是周幾

image.png

獲取月末是周幾

image.png

相關文章
相關標籤/搜索