日付関連の操作関数は、私たちが日常の業務開発で最も頻繁に触れる関数です。もちろん、ほとんどの学生は date() と time() という 2 つの関数を最もよく使用します。今日はこれら 2 つの関数については説明しません。また、今後の記事でも説明しないかもしれません。結局のところ、これら 2 つの関数も同様です。一般的に使用されます。
マニュアル文書の研究では、いくつかの興味深い機能やこれまで触れたことのない機能を発見したいと考えています。そのため、今日学習している機能は馴染みのないものかもしれません。どのように使われているのか、見たことのないものもたくさんあるかもしれません。
まずはタイムゾーンクラスのオブジェクトです。現在のタイムゾーンに関連する情報を取得するのに役立ちます。
$timezone = new DateTimeZone('Asia/Shanghai'); var_dump($timezone); // object(DateTimeZone)#1 (2) { // ["timezone_type"]=> // int(3) // ["timezone"]=> // string(13) "Asia/Shanghai" // }
この DateTimeZone タイム ゾーン クラスをインスタンス化するときは、タイム ゾーン パラメーターを渡す必要があります。ここで示しているのは、一般的な中国のタイム ゾーン設定です。国際標準タイム ゾーンは東 8 区の北京時間ですが、PHP のタイム ゾーン形式では、タイム ゾーンは上海にちなんで命名されています。
このタイムゾーンクラスは現在指定されているタイムゾーンの位置情報を直接取得することができ、例えばアジア/上海の位置情報はそのまま上海に位置します。
// 时区相关的定位信息 var_dump($timezone->getLocation()); // array(4) { // ["country_code"]=> // string(2) "CN" // ["latitude"]=> // float(31.23333) // ["longitude"]=> // float(121.46666) // ["comments"]=> // string(12) "Beijing Time" // }
getLocation() でタイムゾーンの位置情報を取得できます。経度、緯度のクエリ結果は上海の中心で、コメント欄にも現在のタイムゾーンが北京時間であることが明記されています。
// 时区名称 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" // } // }
getName() メソッドは現在のタイム ゾーンの名前を取得します。これは言うまでもありません。 getOffset() は、子午線からの時間間隔である国際グリニッジ標準時 (GMT) との差を取得します。ここで返されるのは秒であり、時間に変換するとちょうど 8 時間になります。
getTransitions() 関数は、すべてのタイム ゾーン変換の時間を返します。テストした時間は午前中です。返される時間フィールドの内容はグリニッジ時間で、オフセット フィールドは GMT 時間との差を返します。 GMT 時間は UTC 時間と一致しており、日常の勉強や仕事でこの 2 つの用語に触れると、同じ概念として考えることができます。
UTC 時間の標準名は協定世界時であり、国際原子時を基に世界各国の標準時を調整し、世界標準時として位置づけるのが GMT の本来の趣旨です。本初子午線: 平均太陽時、UTC はタイム ゾーン分割の基礎としてもこの子午線を使用します。ただし、厳密な基準からすると完全に同等というわけではなく、具体的な内容はご自身でご確認いただけますが、日々の開発においては同等とみなして構いません。
// 包含 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 オブジェクトを返します。これがこのセクションの主役です。出力される属性についてはあまり説明がありません。フィールド名はすでに非常に直感的であり、値は具体的な違いです。
rreeee見ましたか?出力された内容は、上記の diff() メソッドによって返されたオブジェクトの内容と一致していますが、そのコンストラクター パラメーターが奇妙です。そうです、DateInterval オブジェクトを自分でインスタンス化するときは、その間隔情報を定義する必要があります。この間隔情報は、コンストラクターのパラメーターを通じて渡すものです。
P2D は 2 日の間隔を意味します。最初に P で始まる必要があり、次に Y、M、D などの日付コンテンツを含めることができます。時間コンテンツが必要な場合は、T が必要で、その後に T が必要です。 H と M. 、S によるこのコンテンツ。たとえば、P2Y4DT6H8M は、2 年、4 日、6 時間、8 分の時間間隔を表します。特定のルールについては、ドキュメントの手順を参照してください: https://www.php.net/manual/zh/dateinterval.construct.php。
$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) // }
次のようなフィールド文字列形式の日付データを通じて間隔オブジェクトを返すこともできます。
$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) // }
さらに、オブジェクトを取得した後に出力する場合、DateInterval オブジェクトは次の情報も提供します。 format() メソッドは、printf() 関数のような形式で日付情報を出力できます。ここで使用されるフォーマッタは依然として日付フォーマッタです。
// 从日期语句创建时间间隔 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) // }
出力内容は、実際には属性内の対応する日付と時刻の差です。
時間間隔について説明した後、期間について見てみましょう。タイムサイクルの概念とは何ですか?たとえば、3 日ごとの日付を取得したい場合は、期間関連のクラスを使用して処理できます。
$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
推荐学习:php视频教程
以上がPHP の日付関連の関数とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。