strftime

(PHP 4, PHP 5, PHP 7, PHP 8)

strftimeFormatiert eine Zeit-/Datumsangabe gemäß dem Gebietsschema

Warnung

Diese Funktion wurde in PHP 8.1.0 als DEPRECATED (veraltet) markiert. Es wird dringend davon abgeraten, sich auf diese Funktion zu verlassen.

Alternativ können die folgenden Funktionen verwendet werden:

Beschreibung

#[\Deprecated]
strftime(string $format, ?int $timestamp = null): string|false

Formatiert eine Zeit-/Datumsangabe gemäß dem Gebietsschema. Monats- und Wochentagsnamen sowie andere sprachabhängige Zeichenketten werden entsprechend des per setlocale() eingestellten Wertes dargestellt.

Warnung

Es ist durchaus möglich, dass die verwendete C-Bibliothek nicht alle angegebenen Formatierungszeichen erkennt. In diesem Fall werden diese Zeichen von der PHP-Funktion strftime() nicht unterstützt. Außerdem unterstützen nicht alle Plattformen negative Zeitstempel, weshalb der Wertebereich eines Datums durch den Beginn der Unix-Epoche begrenzt sein könnte. Das bedeutet, dass z. B. %e, %T, %R und %D (und vielleicht noch weitere) und Zeitangaben vor dem Jan 1, 1970 auf Windows-Systemen, einigen Linux-Distributionen und einigen anderen Betriebssytemen nicht funktionieren. Für Windows-Systeme gibt es im » MSDN eine komplette Übersicht der gültigen Platzhalter im Formatierungsstring. Stattdessen sollte die Methode IntlDateFormatter::format() verwendet werden.

Parameter-Liste

format

Folgende Zeichen werden in der Zeichenkette des Parameters format erkannt
format Beschreibung Wertebeispiel
Tag --- ---
%a Abgekürzter Name des Wochentages So bis Sa
%A Ausgeschriebener Name des Wochentages Sonntag bis Samstag
%d Tag des Monats als zweistellige Zahl (ggf. mit vorangestellter Null) 01 bis 31
%e Tag des Monats; einstelligen Werten wird ein Leerzeichen vorangestellt. Unter Windows nicht wie beschrieben implementiert; siehe weiter unten für weitere Informationen. 1 bis 31
%j Tag des Jahres als dreistellige Zahl, ggf. mit vorangestellten Nullen 001 bis 366
%u Numerische Darstellung des Wochentags nach ISO-8601 1 (für Montag) bis 7 (für Sonntag)
%w Numerische Darstellung des Wochentags 0 (für Sonntag) bis 6 (für Samstag)
Woche --- ---
%U Nummer der Kalenderwoche des gegebenen Jahres, beginnend mit dem ersten Sonntag als erste Woche 13 (für die 13. Kalenderwoche des Jahres)
%V Nummer der Kalenderwoche des gegebenen Jahres nach ISO-8601:1988, beginnend mit der ersten Woche des Jahres mit wenigstens 4 Wochentagen, wobei Montag der Start der Kalenderwoche ist 01 bis 53 (wobei 53 eine überlappende Woche repräsentiert)
%W Numerische Darstellung der Kalenderwoche, beginnend mit dem ersten Montag als erste Woche 46 (für die 46. Woche des Jahres, die mit einem Montag beginnt)
Monat --- ---
%b Abgekürzter Monatsname gemäß dem Gebietsschema Jan bis Dez
%B Vollständiger Monatsname gemäß dem Gebietsschema Januar bis Dezember
%h Abgekürzter Monatsname gemäß dem Gebietsschema (ein Alias von %b) Jan bis Dez
%m Zweistellige numerische Darstellung des Monats 01 (für Januar) bis 12 (für Dezember)
Jahr --- ---
%C Zweistellige numerische Darstellung des Jahrhunders (Jahr geteilt durch 100, abgerundet zu einer Ganzzahl) 19 für das 20. Jahrhundert
%g Zweistellige numerische Darstellung des Jahres gemäß dem ISO-8601:1988-Standard (siehe %V) Beispiel: 09 für die Woche des 6. Januar 2009
%G Die vollständige vierstellige numerische Version von %g Beispiel: 2009 für die Woche des 3. Januar 2009
%y Zweistellige numerische Darstellung des Jahres Beispiel: 09 für 2009, 79 für 1979
%Y Vierstellige numerische Darstellung des Jahres Beispiel: 2038
Zeit --- ---
%H Zweistellige numerische Darstellung der Stunde im 24-Stunden-Format 00 bis 23
%k Stunde im 24-Stunden-Format mit einem Leerzeichen vor einstelligen Stunden 0 bis 23
%I Zweistellige numerische Darstellung der Stunde im 12-Stunden-Format 01 bis 12
%l (kleines 'L') Stunde im 12-Stunden-Format mit einem Leerzeichen vor einstelligen Stunden 1 bis 12
%M Zweistellige numerische Darstellung der Minute 00 bis 59
%p 'AM' oder 'PM' in Großbuchstaben, basierend auf der gegebenen Zeit Beispiel: AM für 00:31, PM für 22:23. Das genaue Ergebnis hängt vom Betriebssystem ab und es können auch Varianten in Kleinbuchstaben oder mit Punkten (wie a.m.) zurückgegeben werden.
%P 'am' oder 'pm' in Kleinbuchstaben, basierend auf der gegebenen Zeit Beispiel: am für 00:31, pm für 22:23; wird nicht von allen Betriebssystem unterstützt.
%r Das gleiche wie "%I:%M:%S %p" Beispiel: 09:34:17 PM für 21:34:17
%R Das gleiche wie "%H:%M" Beispiel: 00:35 für 12:35 AM, 16:44 für 4:44 PM
%S Zweistellige numerische Darstellung der Sekunde 00 bis 59
%T Das gleiche wie "%H:%M:%S" Beispiel: 21:34:17 für 09:34:17 PM
%X Bevorzugte Zeitdarstellung gemäß dem Gebietsschema, ohne Datumsangabe Beispiel: 03:59:16 oder 15:59:16
%z Die Zeitverschiebung. Unter Windows nicht wie beschrieben implementiert; siehe weiter unten für weitere Informationen. Beispiel: -0500 für US Eastern Time
%Z Das Zeitzonenkürzel. Unter Windows nicht wie beschrieben implementiert; siehe weiter unten für weitere Informationen. Beispiel: EST für Eastern Time
Datums- und Zeitstempel --- ---
%c Bevorzugter Datums- und Zeitstempel gemäß dem Gebietsschema Beispiel: 05.02.2009 00:45:10 für den 5. Februar 2009 um 00:45:10
%D Das gleiche wie "%m/%d/%y" Beispiel: 02/05/09 für den 5. Februar 2009
%F Das gleiche wie "%Y-%m-%d" (oft verwendet für Datenbankzeitstempel) Beispiel: 2009-02-05 für den 5. Februar 2009
%s Zeitstempel der Unix-Epochenzeit (das gleiche wie die Funktion time()) Beispiel: 305815200 für den 10. September 1979, 08:40:00
%x Bevorzugte Datumsdarstellung gemäß dem Gebietsschema, ohne Zeitangabe Beispiel: 02/05/09 für den 5. Februar 2009
Verschiedenes --- ---
%n Ein Zeilenvorschubzeichen ("\n") ---
%t Ein Tabulatorzeichen ("\t") ---
%% Ein buchstäbliches Prozentzeichen ("%") ---

Warnung

Im Gegensatz zu ISO-9899:1999 beginnt Sun Solaris mit Sonntag als 1. Daraus folgt, dass %u nicht wie in diesem Handbuch beschrieben funktionieren kann.

Warnung

Nur für Windows:

Der Platzhalter %e wird in der Windows-Implementierung dieser Funktion nicht unterstützt. Um diesen Wert zu erhalten, kann stattdessen der Platzhalter %#d verwendet werden. Das Beispiel weiter unten zeigt, wie eine Plattformübergreifende kompatible Funktion geschrieben werden kann.

Die Platzhalter %z und %Z geben beide den Namen der Zeitzone anstelle der Zeitverschiebung oder des Kürzels zurück.

Warnung

Nur für macOS und musl: Der Platzhalter %P wird in der macOS-Implementierung dieser Funktion nicht unterstützt.

timestamp

Der optionale Parameter timestamp ist ein Unix-Zeitstempel vom Typ int. Falls timestamp nicht übergeben wird oder null ist, wird die aktuelle lokale Zeit als Standardwert verwendet. Er entspricht dann also dem Ergebnis der Funktion time().

Rückgabewerte

Gibt eine Zeichenkette zurück, die gemäß format formatiert ist, wobei der angegebene Zeitstempel timestamp verwendet wird, oder die aktuelle Ortszeit, falls kein Zeitstempel angegeben wurde. Monats- und Wochentagsnamen sowie andere sprachabhängige Zeichenketten werden entsprechend des per setlocale() eingestellten Wertes dargestellt. Die Funktion gibt false zurück, wenn format leer ist, nicht unterstützte Konvertierungsangaben enthält, oder wenn die Länge der zurückgegebenen Zeichenkette größer als 4095 wäre.

Fehler/Exceptions

Wenn die Zeitzone ungültig ist, wird bei jedem Aufruf einer Datums/Zeit-Funktion ein Fehler der Stufe E_WARNING erzeugt. Siehe auch date_default_timezone_set()

Da die Ausgabe von der zugrundeliegenden C-Bibliothek abhängt, werden einige Konvertierungszeichen nicht unterstützt. Unter Windows führt die Angabe unbekannter Konvertierungszeichen zu 5 E_WARNING-Meldungen und die Funktion gibt false zurück. Unter anderen Betriebssystemen werden unter Umständen keine E_WARNING-Meldungen erzeugt und die Ausgabe enthält möglicherweise unveränderte Konvertierungszeichen.

Changelog

Version Beschreibung
8.0.0 timestamp ist nun nullable (akzeptiert den null-Wert).

Beispiele

Dieses Beispiel funktioniert nur, wenn auf dem System die entsprechenden Gebietsschemen installiert sind.

Beispiel #1 strftime()-Gebietsschema-Beispiele

<?php
setlocale
(LC_TIME, "C");
echo
strftime("%A");
setlocale(LC_TIME, "fi_FI");
echo
strftime(" in Finnish is %A,");
setlocale(LC_TIME, "fr_FR");
echo
strftime(" in French %A and");
setlocale(LC_TIME, "de_DE");
echo
strftime(" in German %A.\n");
?>

Beispiel #2 ISO 8601:1988 Wochennummer-Beispiel

<?php
/* Dezember 2002 / Januar 2003
ISOWk Mo Di Mi Do Fr Sa So
----- ----------------------------
51 16 17 18 19 20 21 22
52 23 24 25 26 27 28 29
1 30 31 1 2 3 4 5
2 6 7 8 9 10 11 12
3 13 14 15 16 17 18 19 */

// Ausgabe: 28.12.2002 - %V,%G,%Y = 52,2002,2002
echo "28.12.2002 - %V,%G,%Y = " . strftime("%V,%G,%Y", strtotime("12/28/2002")) . "\n";

// Ausgabe: 30.12.2002 - %V,%G,%Y = 1,2003,2002
echo "30.12.2002 - %V,%G,%Y = " . strftime("%V,%G,%Y", strtotime("12/30/2002")) . "\n";

// Ausgabe: 03.01.2003 - %V,%G,%Y = 1,2003,2003
echo "03.01.2003 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/3/2003")) . "\n";

// Ausgabe: 10.01.2003 - %V,%G,%Y = 2,2003,2003
echo "10.01.2003 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/10/2003")) . "\n";



/* Dezember 2004 / Januar 2005
ISOWk Mo Di Mi Do Fr Sa So
----- ----------------------------
51 13 14 15 16 17 18 19
52 20 21 22 23 24 25 26
53 27 28 29 30 31 1 2
1 3 4 5 6 7 8 9
2 10 11 12 13 14 15 16 */

// Ausgabe: 23.12.2004 - %V,%G,%Y = 52,2004,2004
echo "23.12.2004 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("12/23/2004")) . "\n";

// Ausgabe: 31.12.2004 - %V,%G,%Y = 53,2004,2004
echo "31.12.2004- %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("12/31/2004")) . "\n";

// Ausgabe: 02.01.2005 - %V,%G,%Y = 53,2004,2005
echo "02.01.2005 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/2/2005")) . "\n";

// Ausgabe: 03.01.2005 - %V,%G,%Y = 1,2005,2005
echo "03.01.2005 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/3/2005")) . "\n";

?>

Beispiel #3 Plattformübergreifendes Beispiel unter Verwendung des Platzhalters %e

<?php

// 1. Januar ergibt: '%e%1%' (%%, e, %%, %e, %%)
$format = '%%e%%%e%%';

// Prüfe auf Windows, um den Platzhalter %e korrekt zu ersetzen
if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
$format = preg_replace('#(?<!%)((?:%%)*)%e#', '\1%#d', $format);
}

echo
strftime($format);
?>

Beispiel #4 Zeige alle bekannten und unbekannten Formate an

<?php

// Beschreibe die Formate
$strftimeFormats = array(
'A' => 'Ausgeschriebener Name des Wochentages',
'B' => 'Vollständiger Monatsname gemäß dem Gebietsschema',
'C' => 'Zweistellige numerische Darstellung des Jahrhunders (Jahr geteilt durch 100, abgerundet zu einer Ganzzahl)',
'D' => 'Das gleiche wie "%m/%d/%y"',
'E' => '',
'F' => 'Das gleiche wie "%Y-%m-%d"',
'G' => 'Vollständige vierstellige numerische Version von %g',
'H' => 'Zweistellige numerische Darstellung der Stunde im 24-Stunden-Format',
'I' => 'Zweistellige numerische Darstellung der Stunde im 12-Stunden-Format',
'J' => '',
'K' => '',
'L' => '',
'M' => 'Zweistellige numerische Darstellung der Minute',
'N' => '',
'O' => '',
'P' => '"am" oder "pm" in Kleinbuchstaben, basierend auf der gegebenen Zeit',
'Q' => '',
'R' => 'Das gleiche wie "%H:%M"',
'S' => 'Zweistellige numerische Darstellung der Sekunde',
'T' => 'Das gleiche wie "%H:%M:%S"',
'U' => 'Nummer der Kalenderwoche des angegebenen Jahres, beginnend mit dem ersten Sonntag als erste Woche',
'V' => 'Nummer der Kalenderwoche des angegebenen Jahres gemäß ISO-8601:1988, beginnend mit der ersten Woche des Jahres mit wenigstens 4 Wochentagen, wobei Montag der Start der Kalenderwoche ist',
'W' => 'Numerische Darstellung der Kalenderwoche, beginnend mit dem ersten Montag als erste Woche',
'X' => 'Bevorzugte Zeitdarstellung gemäß dem Gebietsschema, ohne Datumsangabe',
'Y' => 'Vierstellige numerische Darstellung des Jahres',
'Z' => 'Das Zeitzonenkürzel oder die Zeitzone (abhängig vom Betriebssystem)',
'a' => 'Abgekürzter Name des Wochentages',
'b' => 'Abgekürzter Monatsname gemäß dem Gebietsschema',
'c' => 'Bevorzugter Datums- und Zeitstempel gemäß dem Gebietsschema',
'd' => 'Tag des Monats als zweistellige Zahl (ggf. mit vorangestellten Nullen)',
'e' => 'Tag des Monats als Dezimalwert; einstelligen Werten wird ein Leerzeichen vorangestellt',
'f' => '',
'g' => 'Zweistellige numerische Darstellung des Jahres gemäß dem ISO-8601:1988-Standard (siehe %V)',
'h' => 'Abgekürzter Monatsname gemäß dem Gebietsschema (ein Alias von %b)',
'i' => '',
'j' => 'Tag des Jahres als dreistellige Zahl, ggf. mit vorangestellten Nullen',
'k' => 'Stunde im 24-Stunden-Format mit einem Leerzeichen vor einstelligen Stunden',
'l' => 'Stunde im 12-Stunden-Format mit einem Leerzeichen vor einstelligen Stunden',
'm' => 'Zweistellige numerische Darstellung des Monats',
'n' => 'Ein Zeilenvorschubzeichen ("\n")',
'o' => '',
'p' => '"AM" oder "PM" in Großbuchstaben, basierend auf der gegebenen Zeit',
'q' => '',
'r' => 'Das gleiche wie "%I:%M:%S %p"',
's' => 'Zeitstempel der Unix-Epochenzeit',
't' => 'Ein Tabulatorzeichen ("\t")',
'u' => 'Numerische Darstellung des Wochentags gemäß ISO-8601',
'v' => '',
'w' => 'Numerische Darstellung des Wochentags',
'x' => 'Bevorzugte Datumsdarstellung gemäß dem Gebietsschema, ohne Zeitangabe',
'y' => 'Zweistellige numerische Darstellung des Jahres',
'z' => 'Entweder die Zeitverschiebung gegenüber UTC oder das Zeitzonenkürzel (abhängig vom Betriebssystem)',
'%' => 'Ein buchstäbliches Prozentzeichen ("%")',
);

// Ergebnisse
$strftimeValues = array();

// Werte die Formate aus und unterdrücke dabei eventuelle Fehler
foreach ($strftimeFormats as $format => $description) {
if (
false !== ($value = @strftime("%{$format}"))) {
$strftimeValues[$format] = $value;
}
}

// Ermittle den längsten Wert
$maxValueLength = 2 + max(array_map('strlen', $strftimeValues));

// Melde bekannte Formate
foreach ($strftimeValues as $format => $value) {
echo
"Bekanntes Format : '{$format}' = ", str_pad("'{$value}'", $maxValueLength), " ( {$strftimeFormats[$format]} )\n";
}

// Melde unbekannte Formate
foreach (array_diff_key($strftimeFormats, $strftimeValues) as $format => $description) {
echo
"Unbekanntes Format : '{$format}' ", str_pad(' ', $maxValueLength), ($description ? " ( {$description} )" : ''), "\n";
}

?>

Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:

Bekanntes Format   : 'A' = 'Freitag'                ( Ausgeschriebener Name des Wochentages )
Bekanntes Format   : 'B' = 'Dezember'               ( Vollständiger Monatsname gemäß dem Gebietsschema )
Bekanntes Format   : 'C' = '20'                     ( Zweistellige numerische Darstellung des Jahrhunders (Jahr geteilt durch 100, abgerundet zu einer Ganzzahl) )
Bekanntes Format   : 'D' = '12/03/10'               ( Das gleiche wie "%m/%d/%y" )
Bekanntes Format   : 'F' = '2010-12-03'             ( Das gleiche wie "%Y-%m-%d" )
Bekanntes Format   : 'G' = '2010'                   ( Vollständige vierstellige numerische Version von %g )
Bekanntes Format   : 'H' = '11'                     ( Zweistellige numerische Darstellung der Stunde im 24-Stunden-Format )
Bekanntes Format   : 'I' = '11'                     ( Zweistellige numerische Darstellung der Stunde im 12-Stunden-Format )
Bekanntes Format   : 'M' = '24'                     ( Zweistellige numerische Darstellung der Minute )
Bekanntes Format   : 'R' = '11:24'                  ( Das gleiche wie "%H:%M" )
Bekanntes Format   : 'S' = '44'                     ( Zweistellige numerische Darstellung der Sekunde )
Bekanntes Format   : 'T' = '11:24:44'               ( Das gleiche wie "%H:%M:%S" )
Bekanntes Format   : 'U' = '48'                     ( Nummer der Kalenderwoche des angegebenen Jahres, beginnend mit dem ersten Sonntag als erste Woche )
Bekanntes Format   : 'V' = '48'                     ( Nummer der Kalenderwoche des angegebenen Jahres gemäß ISO-8601:1988, beginnend mit der ersten Woche des Jahres mit wenigstens 4 Wochentagen, wobei Montag der Start der Kalenderwoche ist )
Bekanntes Format   : 'W' = '48'                     ( Numerische Darstellung der Kalenderwoche, beginnend mit dem ersten Montag als erste Woche )
Bekanntes Format   : 'X' = '11:24:44'               ( Bevorzugte Zeitdarstellung gemäß dem Gebietsschema, ohne Datumsangabe )
Bekanntes Format   : 'Y' = '2010'                   ( Vierstellige numerische Darstellung des Jahres )
Bekanntes Format   : 'Z' = 'Mitteleuropäische Zeit' ( Das Zeitzonenkürzel oder die Zeitzone (abhängig vom Betriebssystem) )
Bekanntes Format   : 'a' = 'Fr'                     ( Abgekürzter Name des Wochentages )
Bekanntes Format   : 'b' = 'Dez'                    ( Abgekürzter Monatsname gemäß dem Gebietsschema )
Bekanntes Format   : 'c' = '03.12.2010 11:24:44'    ( Bevorzugter Datums- und Zeitstempel gemäß dem Gebietsschema )
Bekanntes Format   : 'd' = '03'                     ( Tag des Monats als zweistellige Zahl (ggf. mit vorangestellten Nullen) )
Bekanntes Format   : 'e' = ' 3'                     ( Tag des Monats als Dezimalwert; einstelligen Werten wird ein Leerzeichen voran gestellt )
Bekanntes Format   : 'g' = '10'                     ( Zweistellige numerische Darstellung  des Jahres gemäß dem ISO-8601:1988-Standard (siehe %V) )
Bekanntes Format   : 'h' = 'Dez'                    ( Abgekürzter Monatsname gemäß dem Gebietsschema (ein Alias von %b) )
Bekanntes Format   : 'j' = '337'                    ( Tag des Jahres als dreistellige Zahl, ggf. mit vorangestellten Nullen )
Bekanntes Format   : 'm' = '12'                     ( Zweistellige numerische Darstellung des Monats )
Bekanntes Format   : 'n' = '
'                      ( Ein Zeilenvorschubzeichen ("\n") )
Bekanntes Format   : 'r' = '11:24:44'               ( Das gleiche wie "%I:%M:%S %p" )
Bekanntes Format   : 't' = '    '                   ( Ein Tabulatorzeichen ("\t") )
Bekanntes Format   : 'u' = '5'                      ( Numerische Darstellung des Wochentags gemäß ISO-8601 )
Bekanntes Format   : 'w' = '5'                      ( Numerische Darstellung des Wochentags )
Bekanntes Format   : 'x' = '03.12.2010'             ( Bevorzugte Datumsdarstellung gemäß dem Gebietsschema, ohne Zeitangabe )
Bekanntes Format   : 'y' = '10'                     ( Zweistellige numerische Darstellung des Jahres )
Bekanntes Format   : 'z' = '+0100'                  ( Entweder der Zeitverschiebung gegenüber UTC oder das Zeitzonenkürzel (abhängig vom Betriebssystem) )
Bekanntes Format   : '%' = '%'                      ( Ein buchstäbliches Prozentzeichen ("%") )
Unbekanntes Format : 'E'
Unbekanntes Format : 'J'
Unbekanntes Format : 'K'
Unbekanntes Format : 'L'
Unbekanntes Format : 'N'
Unbekanntes Format : 'O'
Unbekanntes Format : 'P'                            ( "am" oder "pm" in Kleinbuchstaben, basierend auf der gegebenen Zeit )
Unbekanntes Format : 'Q'
Unbekanntes Format : 'f'
Unbekanntes Format : 'i'
Unbekanntes Format : 'k'                            ( Stunde im 24-Stunden-Format mit einem Leerzeichen vor einstelligen Stunden )
Unbekanntes Format : 'l'                            ( Stunde im 12-Stunden-Format mit einem Leerzeichen vor einstelligen Stunden )
Unbekanntes Format : 'o'
Unbekanntes Format : 'p'                            ( "AM" oder "PM" in Großbuchstaben, basierend auf der gegebenen Zeit )
Unbekanntes Format : 'q'
Unbekanntes Format : 's'                            ( Zeitstempel der Unix-Epochenzeit )
Unbekanntes Format : 'v'

Anmerkungen

Hinweis: %G und %V, die auf ISO 8601:1988-Wochennummern basieren, können unerwartete (obgleich richtige) Ergebnisse ergeben, wenn das Nummernsystem nicht genau verstanden wird. Siehe die %V Beispiele auf dieser Handbuchseite.

Siehe auch

add a note

User Contributed Notes 1 note

up
5
divinity76+spam at gmail dot com
1 year ago
there is a strftime compatibility package for php>=8.1 at https://github.com/alphp/strftime
To Top