In den internationalisierten Komponenten von PHP gibt es auch eine Datumsoperationsklasse, die wir normalerweise nicht verwenden, nämlich die Kalenderoperationsklasse. Es wird gesagt, dass es sich um einen Kalender handelt, aber in Wirklichkeit arbeitet er größtenteils immer noch mit Datum und Uhrzeit und wird im Allgemeinen hauptsächlich zur Datumsformatierung und zum Vergleich verwendet. Normalerweise verwenden wir jedoch direkt datumsbezogene Funktionen oder DateTime-bezogene Klassen, um datumsbezogene Funktionen zu betreiben, was bequemer und flexibler ist als dieser Funktionssatz. Zum Zweck des Lernens werfen wir natürlich einen kurzen Blick darauf.
Formatierungszeit
Beginnen wir zunächst mit der Formatierungszeit.
$cal = IntlCalendar::createInstance(IntlTimeZone::getGMT()); var_dump(get_class($cal), IntlDateFormatter::formatObject($cal, IntlDateFormatter::FULL)); // string(21) "IntlGregorianCalendar" // string(66) "2020年11月18日星期三 格林尼治标准时间 上午12:58:14" $cal1 = IntlCalendar::fromDateTime('2013-02-28 00:01:02 Europe/Berlin'); var_dump(get_class($cal1), IntlDateFormatter::formatObject($cal1, 'yyyy MMMM d HH:mm:ss VVVV', 'de_DE')); // string(21) "IntlGregorianCalendar" // string(41) "2013 Februar 28 00:01:02 Deutschland Zeit"
Die Methode createInstance() der Klasse IntlCalendar gibt ein IntlCalendar-Objekt zurück. Seine Parameter sind optional, müssen jedoch vom Typ TimeZone sein. Die fromDateTime()-Methode generiert ebenfalls ein IntlCalendar-Objekt, kann jedoch ein DateTime-Objekt oder einen Datumstyp-String als Parameter festlegen.
Sie können sehen, dass wir nach Verwendung der get_class()-Methode für das zurückgegebene Objekt sehen können, dass es sich tatsächlich um ein IntlGregorianCalendar-Gregorian-Kalenderobjekt handelt. Zu diesem Zeitpunkt können Sie die formatObject()-Methode der IntlDateFormatter-Klasse verwenden, um den Ausgabeinhalt zu formatieren. Verschiedene regionale Einstellungen zeigen unterschiedliche Ergebnisse in der Formatierungssprache an.
Zeitstempel zurückgeben
echo IntlCalendar::getNow(), PHP_EOL; // 1605661094417
Ich werde nicht viel erklären, aber diese statische Methode gibt einen Zeitstempel mit Millisekunden zurück.
Zeitzonenbezogene Einstellungen
Solange sich die Internationalisierungsfunktionen auf die Zeitzone TimeZone beziehen, ist die Kalenderklasse keine Ausnahme.
ini_set('intl.default_locale', 'de_DE'); ini_set('date.timezone', 'Europe/Berlin'); $cal = IntlCalendar::createInstance(); print_r($cal->getTimeZone()); // IntlTimeZone Object // ( // [valid] => 1 // [id] => Europe/Berlin // [rawOffset] => 3600000 // [currentOffset] => 3600000 // ) echo $cal->getLocale(Locale::ACTUAL_LOCALE), PHP_EOL; // de echo $cal->getLocale(Locale::VALID_LOCALE), PHP_EOL; // de_DE
Verwenden Sie getTimeZone(), um die aktuellen Zeitzoneninformationen abzurufen. getLocale() unterscheidet sich nicht von der getLocale()-Methode anderer verwandter Funktionsklassen in unserem vorherigen Artikel. Zusätzlich zu ini_set() kann diese TimeZone-Eigenschaft natürlich auch direkt über die setTimeZone()-Methode des Objekts geändert werden.
ini_set('intl.default_locale', 'zh_CN'); ini_set('date.timezone', 'Asia/Shanghai'); $cal = IntlCalendar::createInstance(); print_r($cal->getTimeZone()); // IntlTimeZone Object // ( // [valid] => 1 // [id] => Asia/Shanghai // [rawOffset] => 28800000 // [currentOffset] => 28800000 // ) $cal->setTimeZone('UTC'); print_r($cal->getTimeZone()); // IntlTimeZone Object // ( // [valid] => 1 // [id] => UTC // [rawOffset] => 0 // [currentOffset] => 0 // ) echo $cal->getLocale(Locale::ACTUAL_LOCALE), PHP_EOL; // zh echo $cal->getLocale(Locale::VALID_LOCALE), PHP_EOL; // zh_Hans_CN
Kalenderbezogene Vorgänge
Informationen zu den Maximal- und Minimalwerten des Zeitfelds
Was bedeutet das? Schauen wir uns zunächst den Code an.
$cal = IntlCalendar::fromDateTime('2020-02-15'); var_dump($cal->getActualMaximum(IntlCalendar::FIELD_DAY_OF_MONTH)); //29 var_dump($cal->getMaximum(IntlCalendar::FIELD_DAY_OF_MONTH)); //31 var_dump($cal->getActualMinimum(IntlCalendar::FIELD_DAY_OF_MONTH)); //1 var_dump($cal->getMinimum(IntlCalendar::FIELD_DAY_OF_MONTH)); //1 var_dump($cal->getLeastMaximum(IntlCalendar::FIELD_DAY_OF_MONTH));// 28 $cal->add(IntlCalendar::FIELD_EXTENDED_YEAR, -1); var_dump($cal->getActualMaximum(IntlCalendar::FIELD_DAY_OF_MONTH)); //28 var_dump($cal->getMaximum(IntlCalendar::FIELD_DAY_OF_MONTH)); //31 var_dump($cal->getActualMinimum(IntlCalendar::FIELD_DAY_OF_MONTH)); //1 var_dump($cal->getMinimum(IntlCalendar::FIELD_DAY_OF_MONTH)); //1 var_dump($cal->getLeastMaximum(IntlCalendar::FIELD_DAY_OF_MONTH));// 28
Was zum Teufel ist das für ein Haufen oben? Tatsächlich geben diese Methoden die Maximal- und Minimalwerte des angegebenen Parameterfeldinhalts zurück. Was wir beispielsweise betrachten, ist FIELD_DAY_OF_MONTH, also die Anzahl der Tage im Monat. getActualMaximum() gibt den tatsächlichen Wert zurück. Der Februar 2020 hat beispielsweise 29 Tage. getMaximum() gibt den Maximalwert des normalen Monats zurück, nämlich 31. getActualMinimum() und getMinimum() geben den tatsächlichen Mindestwert und den normalen Mindestwert zurück, die beide 1 für den Monat sind, und es wird definitiv 1 Tag in jedem Monat geben. Die Methode getLeastMaximum() dient dazu, den minimalen lokalen Maximalwert des Feldes zu ermitteln. Die minimale Anzahl von Tagen im Februar beträgt 28 Tage und die lokale Höchstzahl beträgt 28 Tage, während andere Monate 30 und 31 Tage haben.
Startdatum der Woche
Mit dieser Funktion können Sie hauptsächlich den Wochentag festlegen, an dem das Startdatum der Woche liegt. Beispielsweise ist für die internationale Standardzeit in Europa und den Vereinigten Staaten der Montag nicht der Wochenanfang, sondern der Sonntag der erste Tag der Woche. Dieses Problem kann in verschiedenen Kalenderanwendungen auftreten.
$cal = IntlCalendar::createInstance(); $cal->set(2020, 5, 30); var_dump($cal->getFirstDayOfWeek()); // 1 echo IntlDateFormatter::formatObject($cal, <<<EOD 'local day of week: 'cc' week of month : 'W' week of year : 'ww EOD ), PHP_EOL; // local day of week: 3 // week of month : 5 // week of year : 27
In der aktuellen Zeitzone ist das von unserer getFirstDayOfWeek() zurückgegebene Ergebnis 1, d. h. Montag ist der Startpunkt der Woche und der Wochentag wird ab 0 berechnet. Die Methode set() kann ein bestimmtes Datum festlegen. Bitte beachten Sie, dass der Monat auch bei 0 beginnt. Anschließend verwenden wir IntlDateFormatter::formatObject(), um den Wochentag, die Woche des Monats und die Woche des aktuellen Jahres auszugeben. Hier legen wir den 30. Juni 2020 fest. Das durch „cc“ dargestellte aktuelle Datum ist Donnerstag in der Wochenmitte, also der vierte Tag der Woche (nicht der angegebene 30. Juni, an dem wir die Codezeit ausführen). dass wir es nach der Änderung sehen können), ist die aktuelle Woche die fünfte Woche im aktuellen Monat und die aktuelle Woche ist die 27. Woche im gesamten Jahr. Was wäre, wenn wir die Startzeit dieser Woche ändern würden?
$cal->setFirstDayOfWeek(3); var_dump($cal->getFirstDayOfWeek()); // int(5) echo IntlDateFormatter::formatObject($cal, <<<EOD 'local day of week: 'cc' week of month : 'W' week of year : 'ww EOD ), PHP_EOL; // local day of week: 1 // week of month : 6 // week of year : 27
Nun, „cc“ hat sich in 1 geändert und es ist jetzt Montag. Wir befinden uns nun in Woche 6 des aktuellen Monats, da wir die Woche nun am Donnerstag beginnen.
Kalendervergleich
Kalenderobjektvergleich
$cal1 = IntlCalendar::createInstance(); $cal2 = IntlCalendar::createInstance(); var_dump($cal1->equals($cal2)); // bool(true) $cal2->setTime($cal1->getTime() + 1); var_dump($cal1->equals($cal2)); // bool(false)
Die Eigenschaften innerhalb des Kalenderobjekts sind natürlich unterschiedlich. Das von der Methode equal() zurückgegebene Ergebnis ist falsch.
Kalenderobjektdifferenz
Zusätzlich zum Vergleich von Kalenderobjekten können Sie auch die Differenzinformationen zwischen zwei Kalenderzeiten erhalten.
$cal1 = IntlCalendar::fromDateTime('2019-1-29 09:00:11'); $cal2 = IntlCalendar::fromDateTime('2020-03-01 09:19:29'); $time = $cal2->getTime(); echo "之前的时间: ", IntlDateFormatter::formatObject($cal1), "\n"; // 之前的时间: 2019年1月29日 上午9:00:11 printf( "两个时间的差别: %d year(s), %d month(s), " . "%d day(s), %d hour(s) and %d minute(s)\n", $cal1->fieldDifference($time, IntlCalendar::FIELD_YEAR), $cal1->fieldDifference($time, IntlCalendar::FIELD_MONTH), $cal1->fieldDifference($time, IntlCalendar::FIELD_DAY_OF_MONTH), $cal1->fieldDifference($time, IntlCalendar::FIELD_HOUR_OF_DAY), $cal1->fieldDifference($time, IntlCalendar::FIELD_MINUTE) ); // 两个时间的差别: 1 year(s), 1 month(s), 1 day(s), 0 hour(s) and 19 minute(s) echo "之后的时间: ", IntlDateFormatter::formatObject($cal1), "\n"; // 之后的时间: 2020年3月1日 上午9:19:11
Sie können sehen, dass mit der Methode fieldDifference() die relevanten Informationen zwischen dem Kalenderobjekt und dem Vergleichsdatum abgerufen werden können. Es ist zu beachten, dass nach der Verwendung von fieldDifference() alle ursprünglichen Kalenderobjekte zu neuen Datumsinformationen werden.
Weitere Informationen
Anzeigen des Locale-Schlüsselwortwertsatzes
print_r(iterator_to_array(IntlCalendar::getKeywordValuesForLocale('calendar', 'zh_CN', true))); // Array // ( // [0] => gregorian // [1] => chinese // ) print_r(iterator_to_array(IntlCalendar::getKeywordValuesForLocale('calendar', 'zh_CN', false))); // Array // ( // [0] => gregorian // [1] => chinese // [2] => japanese // [3] => buddhist // [4] => roc // [5] => persian // [6] => islamic-civil // [7] => islamic // [8] => hebrew // [9] => indian // [10] => coptic // [11] => ethiopic // [12] => ethiopic-amete-alem // [13] => iso8601 // [14] => dangi // [15] => islamic-umalqura // [16] => islamic-tbla // [17] => islamic-rgsa // )
Der erste Parameter der getKeywordValuesForLocale()-Methode kann nur auf den Kalender festgelegt werden, gefolgt vom Ausfüllen der relevanten Bereiche, und der zurückgegebene Inhalt ist der relevante, vom Strom unterstützte Inhalt locale Wortwertinformationen.
Regionaler Sprachtyp
$cal = IntlCalendar::createInstance(NULL, '@calendar=ethiopic-amete-alem'); var_dump($cal->getType()); // string(19) "ethiopic-amete-alem" $cal = new IntlGregorianCalendar(); var_dump($cal->getType()); // string(9) "gregorian"
Offensichtlich gibt die Methode getType() den Typ der angegebenen Sprachregionsinformationen zurück.
滚动日历
var_dump(IntlDateFormatter::formatObject($cal)); // string(31) "2020年11月18日 上午9:14:59" $cal->roll(IntlCalendar::FIELD_DAY_OF_MONTH, true); var_dump(IntlDateFormatter::formatObject($cal)); // string(31) "2020年11月19日 上午9:14:59"
使用 roll() 方法可以滚动或者说是卷动日历,在这里我们将日历滚动一天,也就是加了一天的时间。
转换为 DateTime 对象
var_dump($cal->toDateTime()); // object(DateTime)#4 (3) { // ["date"]=> // string(26) "2020-11-19 09:14:59.000000" // ["timezone_type"]=> // int(3) // ["timezone"]=> // string(13) "Asia/Shanghai" // }
使用 toDateTime() 方法就可以将当前的 IntlCalendar 对象转换成 DateTime 对象。
当前系统中支持的所有区域信息
print_r(IntlCalendar::getAvailableLocales()); // Array // ( // [0] => af // [1] => af_NA // [2] => af_ZA // [3] => agq // [4] => agq_CM // [5] => ak // [6] => ak_GH // [7] => am // [8] => am_ET // [9] => ar // …… // ……
getAvailableLocales() 返回的是当前系统中所有支持可用的 Locale 信息。
总结
关于日历类其实还有很多方法函数,但是看得人非常头晕,英文解释不多,资料也不清晰,所以这里就是简单的列举了一些内容。大家还是报以学习的心态了解即可,当需要使用到的时候可以快速地想起还这些功能就可以了。
推荐学习:《PHP视频教程》