Datumsbezogene Betriebsfunktionen sind die Funktionen, mit denen wir in unserer täglichen Arbeitsentwicklung am häufigsten in Kontakt kommen. Natürlich verwenden die meisten Schüler am häufigsten die beiden Funktionen date() und time(). Über diese beiden Funktionen werden wir heute nicht sprechen, und vielleicht werden wir auch in den folgenden Artikeln nicht darüber sprechen häufig verwendet. Beim Studium der Handbuchdokumente möchte ich einige interessante Funktionen oder Funktionen entdecken, mit denen ich noch nie in Berührung gekommen bin. Daher werden die Funktionen, die wir heute lernen, möglicherweise nicht von jedem verwendet, und es gibt möglicherweise sogar viele Funktionen, die noch nie jeder gesehen hat .
Zeitzonenklassenbezogene Funktionen
Erstens ist es ein Objekt der Zeitzonenklasse. Es kann uns helfen, Informationen zur aktuellen Zeitzone zu erhalten.
$timezone = new DateTimeZone('Asia/Shanghai'); var_dump($timezone); // object(DateTimeZone)#1 (2) { // ["timezone_type"]=> // int(3) // ["timezone"]=> // string(13) "Asia/Shanghai" // }
Beim Instanziieren dieser DateTimeZone-Zeitzonenklasse müssen Sie einen Zeitzonenparameter übergeben. Was wir hier angeben, ist die allgemeine chinesische Zeitzoneneinstellung. Obwohl unsere internationale Standardzeitzone die Pekinger Zeit im östlichen achten Bezirk ist, ist unsere Zeitzone im Zeitzonenformat in PHP nach Shanghai benannt.
Diese Zeitzonenklasse kann die Positionierungsinformationen der aktuell angegebenen Zeitzone direkt abrufen. Beispielsweise werden die Positionierungsinformationen von Asien/Shanghai direkt nach Shanghai positioniert.
// 时区相关的定位信息 var_dump($timezone->getLocation()); // array(4) { // ["country_code"]=> // string(2) "CN" // ["latitude"]=> // float(31.23333) // ["longitude"]=> // float(121.46666) // ["comments"]=> // string(12) "Beijing Time" // }
Sie können die Informationen zur Zeitzonenpositionierung über getLocation() abrufen. Das Abfrageergebnis für Längen- und Breitengrad ist das Zentrum von Shanghai. Das Kommentarfeld zeigt auch deutlich an, dass die aktuelle Zeitzone Pekinger Zeit ist.
// 时区名称 var_dump($timezone->getName()); // string(13) "Asia/Shanghai" // 相对于 GMT 的时差 var_dump($timezone->getOffset(new DateTime('now', $timezone))); // int(28800) // 所有时区转换信息 var_dump($timezone->getTransitions(time())); // array(1) { // [0]=> // array(5) { // ["ts"]=> // int(1601168813) // ["time"]=> // string(24) "2020-09-27T01:06:53+0000" // ["offset"]=> // int(28800) // ["isdst"]=> // bool(false) // ["abbr"]=> // string(3) "CST" // } // }
Die Methode getName() ruft den Namen der aktuellen Zeitzone ab, was selbstverständlich ist. getOffset() ermittelt die Differenz zur International Greenwich Mean Time (GMT), also dem Zeitintervall vom Meridian. Zurückgegeben werden hier Sekunden, also genau 8 Stunden nach der Umrechnung in Stunden. Die Funktion getTransitions() gibt die Zeit aller Zeitzonenkonvertierungen zurück. Die von mir getestete Zeit war der Morgen. Der zurückgegebene Zeitfeldinhalt ist die Greenwich-Zeit, und das Offset-Feld gibt die Differenz zur GMT-Zeit zurück. Die GMT-Zeit stimmt mit der UTC-Zeit überein. Wenn wir in unserem täglichen Studium und unserer Arbeit mit diesen beiden Begriffen in Berührung kommen, können wir sie als dasselbe Konzept betrachten.
Der Standardname der UTC-Zeit ist Koordinierte Weltzeit. Die Standardzeit von Ländern auf der ganzen Welt wird auf dieser Grundlage angepasst. Die ursprüngliche Absicht von GMT besteht darin, die mittlere Sonnenzeit des Nullmeridians festzulegen . UTC teilt auch Zeitzonen basierend auf diesem Meridian ein. Nach strengen Maßstäben sind sie jedoch nicht völlig gleich. Sie können den spezifischen Inhalt selbst überprüfen, aber für unsere tägliche Entwicklung können sie als gleichwertig angesehen werden. Die statische Methode
// 包含 dst (夏令时),时差和时区信息的关联数组 var_dump(DateTimeZone::listAbbreviations()); // array(144) { // ["acdt"]=> // array(6) { // [0]=> // array(3) { // ["dst"]=> // bool(true) // ["offset"]=> // int(37800) // ["timezone_id"]=> // string(18) "Australia/Adelaide" // } // [1]=> // array(3) { // ["dst"]=> // bool(true) // ["offset"]=> // int(37800) // ["timezone_id"]=> // string(21) "Australia/Broken_Hill" // } // …… // …… // 包含了所有时区标示符的索引数组 var_dump(DateTimeZone::listIdentifiers()); // array(426) { // [0]=> // string(14) "Africa/Abidjan" // [1]=> // string(12) "Africa/Accra" // [2]=> // string(18) "Africa/Addis_Ababa" // [3]=> // string(14) "Africa/Algiers" // …… // ……
listAbbreviations() gibt den Zeitunterschied und die Zeitzoneninformationen im Zusammenhang mit der Sommerzeit zurück. Sommer- und Winterzeit sind auch in westlichen Ländern ein Lebensstandard. Wir haben nicht viel Kontakt mit ihnen, daher werde ich sie hier nicht erklären. Studenten, die grenzüberschreitende Projekte oder europäisches und amerikanisches Outsourcing durchführen, sollten damit vertraut sein. Die Methode listIdentifiers() gibt ein Index-Array zurück, das alle Zeitzonen-IDs enthält. Hier können Sie alle unterstützten Zeitzoneninformationen sehen.
Datumsintervalloperation
Vielleicht haben Sie eine Intervalloperation für Datum und Uhrzeit durchgeführt, beispielsweise die diff()-Methode des DateTime-Objekts.
$today = new DateTime('2020-09-27'); $beforeYestoday = new DateTime("2020-09-25"); var_dump($today->diff($beforeYestoday)); // object(DateInterval)#5 (16) { // ["y"]=> // int(0) // ["m"]=> // int(0) // ["d"]=> // int(2) // ["h"]=> // int(0) // ["i"]=> // int(0) // ["s"]=> // int(0) // ["f"]=> // float(0) // ["weekday"]=> // int(0) // ["weekday_behavior"]=> // int(0) // ["first_last_day_of"]=> // int(0) // ["invert"]=> // int(1) // ["days"]=> // int(2) // ["special_type"]=> // int(0) // ["special_amount"]=> // int(0) // ["have_weekday_relative"]=> // int(0) // ["have_special_relative"]=> // int(0) // }
Wie aus den gedruckten Ergebnissen ersichtlich ist, gibt das diff()-Objekt ein DateInterval-Objekt zurück. Dies ist der Protagonist unseres Abschnitts. Es gibt nicht viele Erklärungen zu den von ihm ausgegebenen Attributen. Die Feldnamen sind bereits sehr intuitiv und die Werte sind die spezifischen Unterschiede.
$interval = new DateInterval("P2D"); var_dump($interval); // object(DateInterval)#2 (16) { // ["y"]=> // int(0) // ["m"]=> // int(0) // ["d"]=> // int(2) // ["h"]=> // int(0) // ["i"]=> // int(0) // ["s"]=> // int(0) // ["f"]=> // float(0) // ["weekday"]=> // int(0) // ["weekday_behavior"]=> // int(0) // ["first_last_day_of"]=> // int(0) // ["invert"]=> // int(0) // ["days"]=> // bool(false) // ["special_type"]=> // int(0) // ["special_amount"]=> // int(0) // ["have_weekday_relative"]=> // int(0) // ["have_special_relative"]=> // int(0) // }
Hast du es gesehen? Der gedruckte Inhalt stimmt mit dem Inhalt des von der oben genannten diff()-Methode zurückgegebenen Objekts überein, seine Konstruktorparameter sind jedoch seltsam. Richtig, wenn wir ein DateInterval-Objekt selbst instanziieren, müssen wir seine Intervallinformationen dafür definieren. Diese Intervallinformationen übergeben wir über die Parameter des Konstruktors. P2D bedeutet ein Intervall von 2 Tagen. Es muss zuerst mit einem P beginnen und kann dann Datumsinhalte wie Y, M und D enthalten. Wenn Zeitinhalte benötigt werden, ist ein T erforderlich, gefolgt von H, M und S-Inhalt. Beispielsweise stellt P2Y4DT6H8M das Zeitintervall von 2 Jahren, 4 Tagen, 6 Stunden und 8 Minuten dar. Spezifische Regeln finden Sie in den Anweisungen im Dokument: https://www.php.net/manual/zh/dateinterval.construct.php.
$interval = new DateInterval("P2Y4DT6H8M"); var_dump($interval); // object(DateInterval)#5 (16) { // ["y"]=> // int(2) // ["m"]=> // int(0) // ["d"]=> // int(4) // ["h"]=> // int(6) // ["i"]=> // int(8) // ["s"]=> // int(0) // ["f"]=> // float(0) // ["weekday"]=> // int(0) // ["weekday_behavior"]=> // int(0) // ["first_last_day_of"]=> // int(0) // ["invert"]=> // int(0) // ["days"]=> // bool(false) // ["special_type"]=> // int(0) // ["special_amount"]=> // int(0) // ["have_weekday_relative"]=> // int(0) // ["have_special_relative"]=> // int(0) // }
Wir können Intervallobjekte auch über Datumsdaten in Form von Feldzeichenfolgen zurückgeben, wie zum Beispiel:
// 从日期语句创建时间间隔 var_dump(DateInterval::createFromDateString('2 days')); // object(DateInterval)#3 (16) { // ["y"]=> // int(0) // ["m"]=> // int(0) // ["d"]=> // int(2) // ["h"]=> // int(0) // ["i"]=> // int(0) // ["s"]=> // int(0) // ["f"]=> // float(0) // ["weekday"]=> // int(0) // ["weekday_behavior"]=> // int(0) // ["first_last_day_of"]=> // int(0) // ["invert"]=> // int(0) // ["days"]=> // bool(false) // ["special_type"]=> // int(0) // ["special_amount"]=> // int(0) // ["have_weekday_relative"]=> // int(0) // ["have_special_relative"]=> // int(0) // }
Darüber hinaus stellt uns das DateInterval-Objekt bei der Ausgabe nach Erhalt des Objekts auch eine format()-Methode zur Verfügung, die dies kann ähnelt der Funktion printf(), um Datumsinformationen formatiert auszugeben, und der hier verwendete Formatierer ist immer noch der Datumsformatierer.
var_dump($interval->format('%y %d %h %i')); // string(7) "2 4 6 8"
Der Ausgabeinhalt besteht tatsächlich aus den entsprechenden Datums- und Zeitunterschieden in den Attributen.
Zeitperiodenbezogene Funktion
Nachdem wir über das Zeitintervall gesprochen haben, werfen wir einen Blick auf den Zeitraum. Was ist das Konzept des Zeitzyklus? Wenn wir beispielsweise das Datum alle drei Tage erhalten möchten, können wir es mit zeitraumbezogenen Klassen verarbeiten.
$start = new DateTime('2020-09-01'); $interval = new DateInterval('P7D'); $end = new DateTime('2020-09-30'); $daterange = new DatePeriod($start, $interval ,$end); var_dump($daterange); // object(DatePeriod)#7 (6) { // ["start"]=> // object(DateTime)#8 (3) { // ["date"]=> // string(26) "2020-09-01 00:00:00.000000" // ["timezone_type"]=> // int(3) // ["timezone"]=> // string(13) "Asia/Shanghai" // } // ["current"]=> // NULL // ["end"]=> // object(DateTime)#9 (3) { // ["date"]=> // string(26) "2020-09-30 00:00:00.000000" // ["timezone_type"]=> // int(3) // ["timezone"]=> // string(13) "Asia/Shanghai" // } // ["interval"]=> // object(DateInterval)#10 (16) { // ["y"]=> // int(0) // ["m"]=> // int(0) // ["d"]=> // int(7) // ["h"]=> // int(0) // ["i"]=> // int(0) // ["s"]=> // int(0) // ["f"]=> // float(0) // ["weekday"]=> // int(0) // ["weekday_behavior"]=> // int(0) // ["first_last_day_of"]=> // int(0) // ["invert"]=> // int(0) // ["days"]=> // bool(false) // ["special_type"]=> // int(0) // ["special_amount"]=> // int(0) // ["have_weekday_relative"]=> // int(0) // ["have_special_relative"]=> // int(0) // } // ["recurrences"]=> // int(1) // ["include_start_date"]=> // bool(true) // } foreach($daterange as $date){ echo $date->format("Ymd"), PHP_EOL; } // 20200901 // 20200908 // 20200915 // 20200922 // 20200929
首先设定了开始时间和结束时间以及一个时间间隔对象,然后用它们做为参数来生成一个 DatePeriod 时间周期对象。它是一个实现了迭代器的对象,所以我们可以直接遍历它,结果就是以 P7D ,也就是 7 天为间隔的一组日期数据。
var_dump($daterange->getDateInterval()); // object(DateInterval)#11 (16) { // ["y"]=> // int(0) // ["m"]=> // int(0) // ["d"]=> // int(7) // ["h"]=> // int(0) // ["i"]=> // int(0) // ["s"]=> // int(0) // ["f"]=> // float(0) // ["weekday"]=> // int(0) // ["weekday_behavior"]=> // int(0) // ["first_last_day_of"]=> // int(0) // ["invert"]=> // int(0) // ["days"]=> // bool(false) // ["special_type"]=> // int(0) // ["special_amount"]=> // int(0) // ["have_weekday_relative"]=> // int(0) // ["have_special_relative"]=> // int(0) // } var_dump($daterange->getStartDate()); // object(DateTime)#11 (3) { // ["date"]=> // string(26) "2020-09-01 00:00:00.000000" // ["timezone_type"]=> // int(3) // ["timezone"]=> // string(13) "Asia/Shanghai" // } var_dump($daterange->getEndDate()); // object(DateTime)#11 (3) { // ["date"]=> // string(26) "2020-09-30 00:00:00.000000" // ["timezone_type"]=> // int(3) // ["timezone"]=> // string(13) "Asia/Shanghai" // }
它的这一堆方法其实返回的就是我们定义的那些构造参数信息。另外,它还可以指定从开始日期往后按照时间间隔返回几条信息。
$period = new DatePeriod($start, $interval, 4); foreach($period as $date){ echo $date->format("Ymd"), PHP_EOL; } // 20200901 // 20200908 // 20200915 // 20200922 // 20200929 var_dump($period->getRecurrences()); // int(4)
recurrences 参数的作用就是按照指定的时间间隔返回几条信息,这里我们是返回 9月1号 之后每次间隔 7 天的 4 条信息,和上面的内容一样。这时我们修改构造函数的值为其它数量,比如修改为 2 ,那么就只会返回到 9月15号 的信息了。它不会受到结束日期的约束,可以返回从开始日期到指定数量之后的所有信息,大家可以自己尝试一下。
总结
今天学习的内容不知道大家有没有接触过,反正我是只用过 diff() 方法来处理过日期之间的差值问题,而且也并没有注意到过它返回的这个对象具体的内容。而另外两个对象则是压根没有印象,完全就是没听说过的感觉。所以说,平常多刷刷手册还是非常有帮助的,今天学习的内容又让我们知道了很多东西,而且 DatePeriod 在具体的业务实现中是肯定会有使用场景的。学习不止,后面我们要学习的内容依然精彩。
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/12.PHP中的日期相关函数(一).php
参考文档:
https://www.php.net/manual/zh/book.datetime.php
各自媒体平台均可搜索【硬核项目经理】