日付形式、タイムゾーン、閏年、日付が異なる月など、日付と時刻を処理する際には考慮すべき点がたくさんあります。自分で使用する必要があります。 PHP 5.2.0 で導入された DateTime 、 DateIntervel クラス、および DateTimeZone クラスは、日付、時刻、タイム ゾーンの作成と処理に役立ちます。
まず、PHP で日付と時刻を処理する関数のデフォルトのタイムゾーンを設定する必要があります。設定されていない場合、PHP は表示します。 E_WARNING メッセージを設定します。デフォルトのタイムゾーンを設定するには 2 つの方法があり、次のように php.ini で設定できます:
date.timezone = 'Asia/Shanghai';
date_default_timezone_set() 関数を使用して実行時に設定することもできます。
<?phpdate_default_timezone_set('Asia/Shanghai');
これら 2 つの方法では、どちらの方法でも有効なタイム ゾーン識別子を使用する必要があります。PHP の完全なタイム ゾーン識別子は、http://php.net/manual/zh/timezones.php で確認できます。 >
<?php$datetime = new DateTime();
<?php$datetime = new DateTime('2016-06-06 10:00 pm');
注: 渡される文字列パラメーターは、有効な日付と時刻の形式 (http: //php.net/manual/zh/datetime.formats.php)
理想的には、PHP が理解できる日付と時刻の形式を指定しますが、常にそうとは限りません。この場合、DateTime が提供する静的メソッド createFromFormat を使用して DateTime インスタンスを作成できます。このメソッドの最初のパラメータは、日付と時刻の形式を表す文字列です。 2 番目のパラメータは、この形式を使用する日付と時刻の文字列です。
<?php$datetime = DateTime::createFromFormat('M j, Y H:i:s', 'June 6, 2016 22:00:00');
注: ご存知かもしれませんが、DateTime::createFromFormat は date 関数に似ています。使用可能な日付と時刻の形式は次の場所にあります: http://php.net/manual/zh/datetime.createfromformat.php
DateInterval インスタンスをインスタンス化するためにコンストラクターを使用します。DateInterval コンストラクターのパラメーターは、文字 P で始まり、その後に整数、最後にピリオドが続く時間間隔の一致を表す文字列です。識別子。前の整数を制限します。有効な期間識別子は次のとおりです。
次の例は、add メソッドを使用して、DateTime インスタンスによって表される日付と時刻を一定期間だけ戻す方法を示しています。
<?php//创建DateTime实例$datetime = new DateTime('2016-06-06 22:00:00');//创建长度为两天的间隔$interval = new DateInterval('P2D');//修改DateTime实例$datetime->add($interval);echo $datetime->format('Y-m-d H:i:s');
<?php$datetime = new DateTime();$interval = DateInterval::createFromDateString('-1 day');$period = new DatePeriod($datetime, $interval, 3);foreach ($period as $date) { echo $date->format('Y-m-d'), PHP_EOL;}
2016-06-062016-06-052016-06-042016-06-03
<?php$timezone = new DateTimeZone('Asia/Shanghai');
<?php$timezone = new DateTimeZone('Asia/Shanghai');$datetime = new DateTime('2016-06-06', $timezone);
<?php$timezone = new DateTimeZone('Asia/Shanghai');$datetime = new DateTime('2016-06-06', $timezone);$datetime->setTimezone(new DateTimeZone('Asia/Hong_kong'));
DatePeriod是迭代器,每次迭代都会产出一个DateTime实例。DatePeriod的第四个参数是可选的,用于显式指定周期的结束日期和时间,如果迭代时想要排除开始日期和时间,可以把构造方法的最后一个参数设为 DatePeriod::EXCLUDE_START_DATE常量:
<?php$datetime = new DateTime();$interval = new DateInterval('P2D');$period = new DatePeriod($datetime, $interval, 3, DatePeriod::EXCLUDE_START_DATE);foreach ($period as $date) { echo $date->format('Y-m-d H:i:s'), PHP_EOL;}
打印的结果是:
2016-06-082016-06-102016-06-12
如果经常需要处理日期和时间,应该使用 nesbot/carbon组件( https://github.com/briannesbitt/Carbon),Laravel框架也是使用了这个组件处理日期和时间,该组件集成了常用的日期及时间处理API,其底层正是使用了我们上面提到的几个日期时间处理类实现了各种功能,有兴趣可以去研究下。