2.11.3. Datumsangaben (Klasse date)

Lernziele

Die Klasse date

In vielen Programmen müssen Berechnungen mit Datumsangaben durchgeführt werden. Typische Problemstellungen sind dabei die folgenden:

Um bequem mit Datumsangaben umgehen und solche Problemstellungen lösen zu können, bietet LEDA die Klasse date an.

Ein Objekt vom Typ date stellt eine Datumsangabe bestehend aus einem Tag d, einem Monat m und einem Jahr y dar. Zulässig sind alle Datumsangaben zwischen dem 1. Januar im Jahre 1 n. Chr. und dem 31. Dezember 9999, die sich an den Gregorianischen Kalender halten.

Als Beispiel für die Klasse date rechnen wir aus, wie viele Tage wir alt sind. Dazu lesen wir Tag, Monat und Jahr unseres Geburtstages ein, konstruieren daraus ein date, besorgen uns ein zweites date, das den heutigen Tag darstellt, und berechnen die Differenz in Tagen der beiden Datumsangaben.

Filename: AgeInDays.C
#include <LEDA/date.h>
#include <iostream>

using leda::date;
using std::cin;
using std::cout;

int main()
{
  cout << "Please enter you birth date:\n";

  int b_day, b_month,b_year;

  cout << "Day: ";   cin >> b_day;
  cout << "Month: "; cin >> b_month;
  cout << "Year: ";  cin >> b_year;

  date birthdate(b_day, date::month(b_month), b_year);

  date today;
  today.set_to_current_date();

  int age_in_days = today - birthdate;

  cout << "You are " << age_in_days << " days old.\n";
}

Für die streng geheimen Daten des Autors spuckt das Programm das Folgende aus:

Please enter your birth date:
Day: 11
Month: 1
Year: 1967
You are 13252 days old.

Eine Datumsangabe kann aus einem Tag, einem Monat und einem Jahr konstruiert werden. Tag und Jahr sind dabei vom Typ int. Der Monat ist vom Aufzählungstyp date::month, der die ganzen Zahlen von 1 bis 12 umfasst; diese können in der Form date::Jan, date::Feb usw. angegeben werden.

Die Methode set_to_current_date() setzt eine Datumsangabe auf das Datum des (gemäß der Systemzeit) gegenwärtigen Tages. Auch der Default-Konstruktor setzt eine Datumsangabe auf das Datum des gegenwärtigen Tages.

Werden zwei Datumsangaben subtrahiert, so liefert der Minus-Operator die Differenz in Tagen.

Umgekehrt kann von einer Datumsangabe ausgehend durch Addition bzw. Subtraktion einer ganzen Zahl zu einem zukünftigen bzw. vergangenen Datum „gesprungen“ werden. Diese Möglichkeit verwenden wir in folgender Problemstellung: Statistisch gesehen fällt der 13. Tag eines jeden Monats häufiger auf einen Freitag als auf alle anderen Wochentage. Wir wollen diese Aussage anhand eines Programms nachprüfen, das über alle zulässigen Datumsangaben der Klasse date iteriert und bei jedem 13. Tag eines Monats mitzählt, um welchen Wochentag es sich handelt:

Filename: Friday13thCounter.C
#include <LEDA/date.h>
#include <LEDA/array.h>
#include <iostream>

using leda::date;
using leda::array;

int main()
{
  array<int> DOW_counter(1,7); // count Day Of Week
  DOW_counter.init(0);

  for (date D(1, date::Jan,1); ; D++)
    {
      if(D.get_day() == 13) 
        DOW_counter[D.get_day_of_week()]++;    

      // don't apply ++ to the last valid date:      
      if(D == date(31, date::Dec, 9999)) break;
    }
  
  for(int i = 1; i <= 7; i++)
    std::cout << i << ": " << DOW_counter[i] << "\n";
}

Die Ausgabe des Programmes ist

1: 17123
2: 17124
3: 17173
4: 17097
5: 17199
6: 17099
7: 17173

Das zeigt, dass der 13. Tag eines jeden Monats häufiger auf den 5. Tag der Woche, d. h. den Freitag, fällt als auf jeden anderen Wochentag. Daraus sollten wir aber nicht schließen, dass es im Leben mehr unglückliche als glückliche Tage gibt!

Der Operator ++ lässt eine Datumsangabe zum jeweils nächsten Tag springen. Entsprechend arbeitet der Operator --. Die Operatoren + und - erlauben es, von einer Datumsangabe aus eine beliebige Zahl von Tagen in die Zukunft oder die Vergangenheit zu springen.

Die Methode get_day() liefert den zu einer Datumsangabe gehörigen Tag im Monat.

Die Methode get_day_of_week() liefert den zu einer Datumsangabe gehörigen Tag in der Woche, d. h. eine ganze Zahl zwischen 1 und 7.

Weitere Informationen

Die Klasse date bietet noch einige andere, nützliche Möglichkeiten. So können z. B. Datumsangaben mit Hilfe eines Formatstrings in fast jedem erdenklichen Format ausgegeben oder eingelesen werden. Mehr Informationen dazu finden sich auf der entsprechenden Manualseite.

Übungen

Übung 22.

Welches Datum hatte der Tag, an dem der Autor das obige Programm laufen ließ, das ausrechnete, dass er genau 13252 Tage alt sei?