【最佳实践系列】PHP 日期、时间和时区处理 API 及组件
处理 日期和时间需要考虑很多事情,例如日期的格式、时区、闰年和天数各异的月份,自己处理太容易出错了,我们应该使用PHP 5.2.0引入的DateTime、DateIntervel和DateTimeZone这些类帮助我们创建及处理日期、时间和时区。
设置默认时区
首先我们要为PHP中处理日期和时间的函数设置默认时区,如果不设置的话,PHP会显示一个 E_WARNING消息,设置默认时区有两种方式,可以像下面这样在 php.ini中设置:
date.timezone = 'Asia/Shanghai';
也可以在运行时使用 date_default_timezone_set()函数设置:
<?phpdate_default_timezone_set('Asia/Shanghai');
这两种方式都要求使用有效的时区标识符,PHP完整的时区标识符可以在这里找到: http://php.net/manual/zh/timezones.php
DateTime类
DateTime类提供了一个面向对象接口,用于管理日期和时间,一个DateTime实例表示一个具体的日期和时间,DateTime构造方法是创建DateTime新实例最简单的方式:
<?php$datetime = new DateTime();
如果没有参数,DateTime类的构造方法创建的是一个表示当前日期和时间的实例。我们可以把一个字符串传入DateTime类的构造方法以便指定日期和时间:
<?php$datetime = new DateTime('2016-06-06 10:00 pm');
注:传入的字符串参数必须是有效的日期和时间格式( http://php.net/manual/zh/datetime.formats.php)
理想情况下,我们会指定PHP能理解的日期和时间格式,可是实际情况并不总是如此,有时我们必须处理其它格式或出乎意料的格式,这时我们可以通过DateTime提供的静态方法 createFromFormat来使用自定义的格式创建DateTime实例,该方法的第一个参数是表示日期和时间格式的字符串,第二个参数是要使用这种格式的日期和时间字符串:
<?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类
处理DateTime实例之前需要先了解DateInterval类,DateInterval实例表示长度固定的时间段(比如两天),或者相对而言的时间段(例如昨天),我们通常使用该类的实例来修改DateTime实例。例如,DateTime提供了用于处理DateTime实例的 add和 sub方法,这两个方法的参数是一个DateInterval实例,表示从DateTime中增加的时间量或减少的时间量。
我们使用构造函数实例化DateInterval实例,DateInterval构造函数的参数是一个表示时间间隔约定的字符串,这个时间间隔约定以字母P开头,后面跟着一个整数,最后是一个周期标识符,限定前面的整数。有效周期标识符如下:
- Y(年)
- M(月)
- D(日)
- W(周)
- H(时)
- M(分)
- S(秒)
间隔约定中既可以有时间也可以有日期,如果有时间需要在日期和时间之间加上字母T,例如,间隔约定P2D表示间隔两天,间隔约定P2DT5H2M表示间隔两天五小时两分钟。
下面的实例演示了如何使用 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');
我们还可以创建反向的DateInterval实例:
<?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
DateTimeZone类
PHP使用DateTimeZone类表示时区,我们只需要把有效的时区标识符传递给DateTimeZone类的构造函数:
<?php$timezone = new DateTimeZone('Asia/Shanghai');
创建DateTime实例通常需要使用DateTimeZone实例,DateTime类构造方法的第二个参数(可选)就是一个DateTimeZone实例,传入这个参数后,DateTime实例的值以及对这个值的所有修改都相对于这个指定的时区,如果不传入则使用的是前面设置的默认时区:
<?php$timezone = new DateTimeZone('Asia/Shanghai');$datetime = new DateTime('2016-06-06', $timezone);
实例化之后还可以使用 setTimezone方法修改DateTime实例的时区:
<?php$timezone = new DateTimeZone('Asia/Shanghai');$datetime = new DateTime('2016-06-06', $timezone);$datetime->setTimezone(new DateTimeZone('Asia/Hong_kong'));
DatePeriod类
有时我们需要迭代处理一段时间内反复出现的一系列日期和时间,DatePeriod类可以解决这个问题(前面已经用到过),DatePeriod类的构造方法接受三个参数而且都必须提供:
- 一个DateTime实例,表示迭代开始的日期和时间
- 一个DateInterval实例,表示下一个日期和时间的间隔
- 一个整数,表示迭代的总次数
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日期组件
如果经常需要处理日期和时间,应该使用 nesbot/carbon组件( https://github.com/briannesbitt/Carbon),Laravel框架也是使用了这个组件处理日期和时间,该组件集成了常用的日期及时间处理API,其底层正是使用了我们上面提到的几个日期时间处理类实现了各种功能,有兴趣可以去研究下。

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Alipay Php ...

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Sesi rampasan boleh dicapai melalui langkah -langkah berikut: 1. Dapatkan ID Sesi, 2. Gunakan ID Sesi, 3. Simpan sesi aktif. Kaedah untuk mengelakkan rampasan sesi dalam PHP termasuk: 1. Gunakan fungsi Sesi_Regenerate_ID () untuk menjana semula ID Sesi, 2. Data sesi stor melalui pangkalan data, 3.

Penerapan prinsip pepejal dalam pembangunan PHP termasuk: 1. Prinsip Tanggungjawab Tunggal (SRP): Setiap kelas bertanggungjawab untuk hanya satu fungsi. 2. Prinsip Terbuka dan Tutup (OCP): Perubahan dicapai melalui lanjutan dan bukannya pengubahsuaian. 3. Prinsip Penggantian Lisch (LSP): Subkelas boleh menggantikan kelas asas tanpa menjejaskan ketepatan program. 4. Prinsip Pengasingan Antara Muka (ISP): Gunakan antara muka halus untuk mengelakkan kebergantungan dan kaedah yang tidak digunakan. 5. Prinsip Inversi Ketergantungan (DIP): Modul peringkat tinggi dan rendah bergantung kepada abstraksi dan dilaksanakan melalui suntikan ketergantungan.

Bagaimana untuk menetapkan keizinan UnixSocket secara automatik selepas sistem dimulakan semula. Setiap kali sistem dimulakan semula, kita perlu melaksanakan perintah berikut untuk mengubahsuai keizinan UnixSocket: sudo ...

Bagaimana cara debug mod CLI dalam phpstorm? Semasa membangun dengan PHPStorm, kadang -kadang kita perlu debug PHP dalam mod Interface Line Command (CLI) ...

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

Artikel membincangkan ciri -ciri keselamatan penting dalam rangka kerja untuk melindungi daripada kelemahan, termasuk pengesahan input, pengesahan, dan kemas kini tetap.
