dato - Hva er den beste måten å finne antall dager i en måned med JavaScript?


Jeg har brukt denne funksjonen, men jeg vil gjerne vite hva som er den mest effektive og nøyaktige måten å få det på.

function daysInMonth(iMonth, iYear) {
   return 32 - new Date(iYear, iMonth, 32).getDate();
}

Svar #1

function daysInMonth (month, year) { // Use 1 for January, 2 for February, etc.
  return new Date(year, month, 0).getDate();
}

console.log(daysInMonth(2, 1999)); // February in a non-leap year.
console.log(daysInMonth(2, 2000)); // February in a leap year.

Dag 0 er den siste dagen i forrige måned. Fordi månedskonstruktøren er 0-basert, fungerer dette bra. Litt av et knep, men det er i utgangspunktet det du gjør når du trekker fra 32.

Se mer: Antall dager i inneværende måned

Svar #2

Noen svar (også på andre spørsmål) hadde skuddårsproblemer eller brukte Date-objektet. Selv om javascripts Date object dekker omtrent 285616 år (100 000 000 dager) på begge sider av 1. januar 1970, var jeg lei av alle slags uventede datokonsistenser på tvers av forskjellige nettlesere (spesielt år 0 til 99). Jeg var også nysgjerrig på hvordan man kan beregne det.

Så jeg skrev en enkel og fremfor alt, liten algoritme for å beregne det korrekte (Proleptisk Gregoriansk/Astronomisk/ISO 8601:2004 (punkt 4.3.2.1), så år 0 eksisterer og er et skuddår og negative år støttes) antallet dager for en gitt måned og et gitt år.
Den bruker den kortslutnings-bitmaske-modulo skuddårsalgoritmen (litt modifisert for js) og vanlig mod-8 månedsalgoritme.

Merk at i AD/BC-notasjon eksisterer ikke år 0 AD/BC: i stedet er år 1 BC skuddåret!
Hvis du trenger å ta hensyn til BC-notasjon, trekk først fra ett år fra (ellers positiv) år-verdi!! (Eller trekk året fra 1 for videre årsberegninger.)

function daysInMonth(m, y){
  return m===2?y&3||!(y%25)&&y&15?28:29:30+(m+(m>>3)&1);
}
<!-- example for the snippet -->
<input type="text" value="enter year" onblur="
  for( var r='', i=0, y=+this.value
     ; 12>i++
     ; r+= 'Month: ' + i + ' has ' + daysInMonth(i, y) + ' days<br>'
     );
  this.nextSibling.innerHTML=r;
" /><div></div>

Merk, måneder må være 1-baserte!

Merk, dette er en annen algoritme enn magiske tall-oppslaget jeg brukte i min Javascript for å beregne dagen i året (1 - 366), fordi her er den ekstra grenen for skuddår kun nødvendig for februar.

Relaterte artikler