@Mikkel - Michaels løsning er da den mindst komplicerede.
At loope over det, som MB gør er tosset - fordi så har du problemet næste år, når det ikke er skud år, og der kun er 28 dage i februar. Og problemet igen om fire - når det er skud år igen... Det er altså molbo-stil!
Michaels løsning er så meget bedre, fordi den vil virke uden tilpasninger for fremtiden.
Mit kendskab til javascript er meget overfladisk, men mit bud vil gøre brug af to simple algoritmer.
1) Skudårs algoritme; "er det skudår" int (årstal) -> bool: årstal % 4 = 0 AND ((årstal % 100 != 0) OR (årstal % 400 = 0))
2) "Kort eller lang måned ved at tælle knoer"-algoritme - den her kender vi fra vi var børn. Venstre hånd knyttes og holdes op. Tæl knoer og mellem rum mellem knoer fra venstre med højre pege finger:
- Januar - på venstre lille finger kno
- Februar - mellem lille og ringe finger kno
- Marts - på ringe kno
- April - mellem ringe og lange kno
- Maj - på lange kno
- Juni - mellem lange og pege kno
- Juli - på pege kno
- August - på lille kno
- September - mellem lige og ringe kno
- Oktober - på ringe kno
- November - mellem ringe og lange
- December - på lange kno
Er det en lang måned så har den 31 dage, er det en kort har den 30 - er det en kort og februar har den 28 eller 29 hvis det er skudår.
Implementering i javascript:
- function isLeapYear($year) {
- return $year % 4 === 0 && (($year % 100 !== 0) || ($year % 400 === 0));
- }
-
- function isShortMonth($month) {
- return $month === 2 || $month === 4 || $month === 6 || $month === 9 || $month === 11;
- }
-
- function daysInMonth($month, $year) {
- if ($month == 2) {
- if (isLeapYear($year)) {
- $days = 29;
- }
- else {
- $days = 28;
- }
- } else {
- if (isShortMonth($month)) {
- $days = 30;
- } else {
- $days = 31;
- }
- }
-
- return $days;
- }
Så kalder du bare daysInMonth med to parametre - månedstal og årstal - og så returnerer den antallet af dage i et år. Den virker for alle årstal.
En javascript haj vil sikkert kunne optimere koden og gøre den endnu simplere.