Woche des Jahres

von Thomas Salvador.

In diesem Beispiel implementieren wir eine Funktion, die die Woche des Jahres (week of year) zu einem gegebenen Datum berechnet.

Dabei werden "deutsche" Verhältnisse zugrundegelegt: Fällt der Erste des Jahres auf einen Montag - Donnerstag, so liegt er in der ersten Woche des Jahres, sonst in der letzten des vorherigen. (Achten Sie bitte auch auf die verwandten Artikel.)

function getWeek(dat) {

// (c) 1999 by Thomas Salvador, Freeware, brauchbar.de
//
// Die hier gebrachten Scripts koennen Sie nach Belieben verwenden, solange
// diese Copyright-Meldung vollstaendig und unveraendert enthalten bleibt
// Jegliche Nutzung mit veraenderter oder entfernter Meldung ist untersagt.

  var y = dat.getFullYear();
  var julianDat = getJulian(dat);
  var dowDat = julianDow(julianDat);

  var workJulian;

  if (dowDat == 0) {
    workJulian = julianDat - 6;
  } else {
    workJulian = julianDat - dowDat + 1;
  }

  var julianFirst = ymd2julian(y, 1, 1);

  var weeksFromFirst = Math.floor((workJulian-julianFirst) / 7) + 1;

  var dowFirst = julianDow(julianFirst);

  var week;
  if (dowFirst == 0 || dowFirst > 4) {
    week = 53 + weeksFromFirst;
    if (week > 53) {
      week -= 53;
    }
  } else {
    week = 1 + weeksFromFirst;
  }

  if (week >= 53) {
    var tempWeek = getWeek(new Date(y+1, 0, 1));
    if (tempWeek == 1)
      week = 1;
  }

  return week;
}

Bei genauerer Betrachtung sieht man, dass die Funktion die Woche des Montages bestimmt, der in der Woche des gegebenen Datums liegt.

Abschließend wird noch eine Funktion benötigt, die das korrekte Jahr zur Woche bestimmt:

function weekYear(dat, wek) {
  var result = dat.getFullYear();

  if (wek == 1 && dat.getMonth() == 11) {
    result++;
  } else {
    if (wek > 50 && dat.getMonth() == 0) {
      result--;
    }
  }

  return result;
}

Beispiel

<script type="text/javascript"><!--
  function genALine(dat) {
    var wek = getWeek(dat);
    document.write('Der ', date2str(dat),
                   ' liegt in Woche ', wek,
                   ' des Jahres ', weekYear(dat, wek), '. <br>');
  }

  var now = new Date();
  genALine(now);

  genALine(new Date(1997, 0, 1));
  genALine(new Date(1997, 11, 31));
  genALine(new Date(1998, 0, 1));
  genALine(new Date(1998, 11, 31));
  genALine(new Date(1999, 0, 1));
//-->
</script>

liefert

Viel Spaß.