Les fonctions d'opération liées aux dates sont les fonctions avec lesquelles nous entrons le plus souvent en contact dans le développement de notre travail quotidien. Bien sûr, la plupart des étudiants peuvent utiliser le plus les deux fonctions date() et time(). Nous ne parlerons pas de ces deux fonctions aujourd'hui, et peut-être n'en parlerons-nous pas dans les articles suivants. Après tout, elles le sont aussi. couramment utilisé. Lorsque j'étudie des documents manuels, je souhaite découvrir des fonctions intéressantes ou des fonctions auxquelles je n'ai jamais été exposé. Par conséquent, les fonctions que nous apprenons aujourd'hui peuvent ne pas être utilisées par tout le monde, et il peut même y avoir de nombreuses fonctions que tout le monde n'a jamais vues.
Fonctions liées à la classe de fuseau horaire
Tout d'abord, c'est un objet de la classe de fuseau horaire. Cela peut nous aider à obtenir des informations relatives au fuseau horaire actuel.
$timezone = new DateTimeZone('Asia/Shanghai'); var_dump($timezone); // object(DateTimeZone)#1 (2) { // ["timezone_type"]=> // int(3) // ["timezone"]=> // string(13) "Asia/Shanghai" // }
Lors de l'instanciation de cette classe de fuseau horaire DateTimeZone, vous devez transmettre un paramètre de fuseau horaire. Ce que nous donnons ici est le réglage général du fuseau horaire chinois. Bien que notre fuseau horaire standard international soit l'heure de Pékin dans le huitième district de l'Est, dans le format de fuseau horaire en PHP, notre fuseau horaire porte le nom de Shanghai.
Cette classe de fuseau horaire peut obtenir directement les informations de positionnement du fuseau horaire actuellement spécifié. Par exemple, les informations de positionnement de l'Asie/Shanghai sont directement positionnées sur Shanghai.
// 时区相关的定位信息 var_dump($timezone->getLocation()); // array(4) { // ["country_code"]=> // string(2) "CN" // ["latitude"]=> // float(31.23333) // ["longitude"]=> // float(121.46666) // ["comments"]=> // string(12) "Beijing Time" // }
Vous pouvez obtenir les informations de positionnement du fuseau horaire via getLocation(). Le résultat de la requête de longitude et de latitude est le centre de Shanghai. Le champ de commentaires indique également clairement que le fuseau horaire actuel est l'heure de Pékin.
// 时区名称 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" // } // }
La méthode getName() obtient le nom du fuseau horaire actuel, ce qui va de soi. getOffset() obtient la différence par rapport au temps moyen international de Greenwich (GMT), qui est l'intervalle de temps à partir du méridien. Ce qui est renvoyé ici est en secondes, soit exactement 8 heures après la conversion en heures. La fonction getTransitions() renvoie l'heure de toutes les conversions de fuseau horaire. L'heure que j'ai testée était le matin. Le contenu du champ horaire renvoyé est l'heure de Greenwich et le champ de décalage renvoie la différence par rapport à l'heure GMT. L'heure GMT est cohérente avec l'heure UTC Si nous entrons en contact avec ces deux termes dans notre étude et notre travail quotidiens, nous pouvons les considérer comme le même concept.
Le nom standard de l’heure UTC est Temps universel coordonné. Basé sur l’heure atomique internationale, l’heure standard des pays du monde est ajustée en fonction de celle-ci. L’intention initiale de GMT est de positionner l’heure solaire moyenne du premier méridien. , UTC divise également les fuseaux horaires en fonction de ce méridien. Cependant, selon des normes strictes, ils ne sont pas complètement égaux. Vous pouvez vérifier le contenu spécifique par vous-même, mais pour notre développement quotidien, ils peuvent être considérés comme équivalents. La méthode statique
// 包含 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() renvoie les informations de décalage horaire et de fuseau horaire liées à l'heure d'été. L'heure d'été et l'heure d'hiver constituent également un niveau de vie dans les pays occidentaux. Nous n'avons pas eu beaucoup de contacts avec eux, je ne les expliquerai donc pas ici. Les étudiants qui réalisent des projets transfrontaliers ou qui externalisent en Europe et aux États-Unis devraient les connaître. La méthode listIdentifiers() renvoie un tableau d'index contenant tous les identifiants de fuseau horaire. Ici, vous pouvez voir toutes les informations de fuseau horaire prises en charge.
Opération d'intervalle de date
Peut-être avez-vous effectué une opération d'intervalle sur la date et l'heure, comme la méthode diff() de l'objet DateTime.
$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) // }
Comme le montrent les résultats imprimés, l'objet diff() renvoie un objet DateInterval. C'est le protagoniste de notre section. Il n'y a pas beaucoup d'explications sur les attributs imprimés par celle-ci. Les noms de champs sont déjà très intuitifs et les valeurs sont les différences spécifiques.
$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) // }
L'avez-vous vu ? Le contenu imprimé est cohérent avec le contenu de l'objet renvoyé par la méthode diff() ci-dessus, mais ses paramètres constructeur sont étranges. C'est vrai, lorsque nous instancions nous-mêmes un objet DateInterval, nous devons définir ses informations d'intervalle pour celui-ci. Ces informations d'intervalle sont ce que nous transmettons via les paramètres du constructeur. P2D signifie un intervalle de 2 jours. Il doit d'abord commencer par un P, puis il peut avoir un contenu de date tel que Y, M et D. Si un contenu temporel est nécessaire, un T est requis, suivi de H, M et Contenu S. Par exemple, P2Y4DT6H8M représente l'intervalle de temps de 2 ans, 4 jours, 6 heures et 8 minutes. Pour des règles spécifiques, veuillez vous référer aux instructions dans le document : 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) // }
Nous pouvons également renvoyer des objets d'intervalle via des données de date sous forme de chaînes de champs, telles que :
// 从日期语句创建时间间隔 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) // }
De plus, lors de la sortie après l'obtention de l'objet, l'objet DateInterval nous fournit également une méthode format(), qui peut être comme la fonction printf() pour afficher les informations de date de manière formatée, et le formateur utilisé ici est toujours le formateur de date.
var_dump($interval->format('%y %d %h %i')); // string(7) "2 4 6 8"
Le contenu de sortie est en fait les différences de date et d'heure correspondantes dans les attributs.
Fonction liée à la période de temps
Après avoir parlé de l'intervalle de temps, jetons un coup d'œil à la période de temps. Quelle est la notion de cycle temporel ? Par exemple, si nous voulons obtenir la date tous les trois jours, nous pouvons utiliser des classes liées à une période pour la traiter.
$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
各自媒体平台均可搜索【硬核项目经理】