Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in datumsbezogene PHP-Funktionen (1)

Einführung in datumsbezogene PHP-Funktionen (1)

藏色散人
藏色散人nach vorne
2021-07-05 16:07:412809Durchsuche

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

各自媒体平台均可搜索【硬核项目经理】


php




阅读 46



本作品系原创,采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议




Einführung in datumsbezogene PHP-Funktionen (1)

硬核项目经理


32 声望

6 粉丝



0 条评论

得票数最新







你知道吗?







Einführung in datumsbezogene PHP-Funktionen (1)

Hardcore Manager


32 Ruf

6 Fans







Werbekolumne








Datumsbezogene Betriebsfunktionen sind das, mit dem wir in unserer täglichen Arbeit und Entwicklung am häufigsten in Berührung 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.

// 包含 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() 静态方法返回的是 夏令时 相关的时差和时区信息。夏令时 和 冬令时 也是西方国家的一种生活标准,我们接触的不多,这里就不做讲解了,对于做跨境项目或者欧美外包的同学应该不会陌生。listIdentifiers() 方法返回的是包含了所有时区标示符的索引数组,这里可以看到所有的支持的时区信息。

日期间隔操作

对时日期时间的间隔操作,或许大家多少都做过一点,比如 DateTime 对象的那个 diff() 方法。

$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)
//   }

从打印的结果可以看出,diff() 对象返回的是一个 DateInterval 对象。这个就是我们这节的主角了,关于它打印出来的这些属性内容就不多解释了,字段名已经非常直观了,值就是具体的差值。

$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)
//   }

看到没有?打印出来的内容和上面用 diff() 方法返回的对象的内容是一致的,但是它的构造函数的参数很奇怪。没错,当我们自己去实例化一个 DateInterval 对象时,需要为它定义它的间隔信息,这个间隔信息就是我们通过构造函数的参数传递进去的。P2D 的意思就是间隔 2 天,首先必须以一个 P 为开头,然后可以有 Y、M、D 这些日期内容,如果需要时间内容的话,需要一个 T 然后再跟上 H、M、S 这些内容。比如 P2Y4DT6H8M 表示的就是 2年4天6小时8分钟 的时间间隔。具体的规则大家还是去看文档中的说明: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)
//   }

我们还可以通过字段串形式的日期数据返回间隔对象,比如:

// 从日期语句创建时间间隔
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)
//   }

此外,在获得对象后进行输出的时候,DateInterval 对象也为我们提供了一个 format() 方法,可以像 printf() 函数一样来格式化地输出日期信息,而且这里用的格式符还是日期的格式符。

var_dump($interval->format('%y %d %h %i'));
// string(7) "2 4 6 8"

输出的内容其实就是属性中对应的那些日期和时间差值。

时间周期相关函数

说完时间间隔了,我们再来看看时间周期。时间周期是个什么概念呢?就比如说我们要每三天间隔一次地获取日期,这时就可以用时间周期相关的类来进行处理。

$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

推荐学习:php视频教程

Das obige ist der detaillierte Inhalt vonEinführung in datumsbezogene PHP-Funktionen (1). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen