Zeit- und Datumsberechnung

Alvine biete mit den Klassen aus dem date-Namespace einige nützliche Funktionen zur Zeit- und Datumsberechnung an.

Grundlagen

Die Basis der Zeitberechnung ist die Klasse Quantity. Diese Klasse stellt alle notwendigen Funktionen und Eigenschaften für die Arbeit mit Datum und Zeit zur Verfügung.

$instant = new \Alvine\Date\Instant(1920, 12, 24);
echo (string)$instant; // 1920-12-24 00:00:00


// Tag der Mondlandung
$instant = new \Alvine\Date\Instant(1969, 7, 21, 2, 56, 20);
echo (string)$instant; // 1969-07-21T02:56:20

// Es erfolgt kein Überlauf, beim Überschreiten
// der einzelnen Bereiche
$instant = new \Alvine\Date\Instant(99999, 9999, 9999, 9999, 9999, 9999);
echo $instant; // 99999-9999-9999T9999:9999:9999

$quantity = new \Alvine\Date\DateTime();
echo (string)$quantity; // 0000-01-01T00:00:00

Eine konkrete Ableitung von Quantity ist die Instant-Klasse, sie definiert einen Moment, der über die Parameter Jahr, Monat, Tag, Stunde, Minute, Sekunde und Nanosekunde definiert ist. Die Klassen Date, Time und Datetime sind konkrete Ableitungen der Klasse AbstractDateTime, die wiederum von Instant abgeleitet ist.

Aktuelle Zeit

Wird für die weitere Verarbeitung die aktuelle Zeit benötigt, so kann dieser über die Methode fromNow() geholt werden.

$timestamp = \Alvine\Date\Time::fromNow();
print_r($timestamp);
echo $timestamp;echo "\r\n";
echo date('Y.m.d H:i:s');

Berechnungen

Mit den Methoden plus und minus kann Zeit angepasst werden. Es wird ein neues Objekt zurück geliefert. Das aktuelle Objekt behält die Zeit.

Beispiele:

Wert
1 day
2 days
2 weeks
3 months
4 years
1 year + 1 day
1 day + 12 hours
3600 seconds

plus

Zeit hinzu zählen

/**
 * aktueller Zeitpunkt
 */
 $now=\Alvine\Date\DateTime::fromNow(); //2018-08-28 05:42:00

/**
 * einen Tag dazu rechnen
 */
 $nextDay = $now->plus('1 day');

 echo $now; //2018-08-28 05:42:00
 echo $nextDay; //2018-08-29 05:42:00

minus

Zeit hinzu zählen

/**
 * aktueller Zeitpunkt
 */
 $now=\Alvine\Date\DateTime::fromNow(); //2018-08-28 05:42:00

/**
 * einen Tag dazu rechnen
 */
 $yesterday = $now->minus('1 day');

 echo $now; //2018-08-28 05:42:00
 echo $yesterday; //2018-08-27 05:42:00

Spezialisierungen

Um bestimmte Sachverhalte besser abzubilden und unnötige Informationen auszublenden, gibt es Spezialklassen, wie die YearMonth-Klasse. Die JahrMonats-Klasse eignet sich zum Beispiel zum Speichern des "Gültig bis"-Datums von Kreditkarten.

// Gültig bis Dezember 2020
$valid=new \Alvine\Date\YearMonth(2020, 12);
echo (string) $valid; // 2020-12

Sekunden

Die Klasse Seconds bildet einen Sonderfall, sie ist nicht von Time, sondern von Instant abgeleitet und kann somit nicht nur Zahlen von 0 bis 59 aufnehmen, sondern auch komplette Timestamps.

Wochentag

Die Klasse DayOfWeek bildet den Wochentag ab.

Wert Tag
1 Montag
2 Dienstag
3 Mittwoch
4 Donnerstag
5 Freitag
6 Samstag
7 Sonntag
/**
 * aktueller Zeitpunkt
 */
$now=\Alvine\Date\DateTime::fromNow(); //2018-08-28 05:42:00

/**
 * Tag der Woche bestimmen
 */
$day=\Alvine\Date\DayOfWeek::getInstanceFromDate(new \Alvine\Date\Date(1990, 12, 24));
echo $day->getValue(); // 1

Lokalisiertes Datum ausgeben

Die Ausgabe eines Datum kann über folgende Anweisung erfolgen.

$now=\Alvine\Date\DateTime::fromNow();

echo \sprintf('%3$02d.%2$02d.%1$02d %4$02d:%5$02d:%6$02d',
    $now->getYear(),
    $now->getMonth(),
    $now->getDay(),
    $now->getHour(),
    $now->getMinute(),
    $now->getSecond());