ModernPHP 密码与时间相关
ModernPHP系列文章 - php自带的密码和事件的方法。
密码
password_hash()
函数生成密码的hash值。该函数的第一个参数是纯文本密码,第二个参数选择所用的hash算法,目前支持的算法有PASSWORD_DEFAULT
(采用bcrypt算法,PHP5.5.0默认)和PASSWORD_BCRYPT
(使用 CRYPT_BLOWFISH 算法),第三参数指定所有的选项,选项有salt(手动指定的盐,7.0已被废弃)和cost(工作因子)。工作因子的默认值是10。
password_verify()
函数可以验证密码和指定的哈希值,验证成功返回true,失败返回false。
password_needs_rehash()
函数验证给定的hash值是否实现了提供的算法和选项。该函数一个参数是给定的hash值,第二个参数选择hash算法,第三参数是选项。
日期与时间
DateTime类
DateTime类提供了一个面对对象的接口,用于管理日期和时间。一个DateTime实例表示了一个具体的日期和时间。通过DateTime类可以简单的创建DateTime实例。
<?php
$datatime = new DateTime();
$datetime = new DateTime('2016-09-27 10:05 AM');
DateTime类的构造函数可以不传任何参数,表示获取的是当前日期和时间的实例,也可以传递一个表示日期和时间的字符串指定其他的日期和时间,该字符串必须符合特定的格式。
当我们需要处理各种特殊格式的日期和时间时,可以使用DateTime::createFromFormat()
静态方法,针对自定义格式创建DateTime实例。该方法的第一个参数是表示日期和时间格式的字符串,第二个参数是使用指定格式的日期和时间的字符串。DateTime::createFromFormat()
静态方法使用的日期和时间字符串的格式和date()函数一样,具体的参照看这里。
<?php
$datetime = DateTime::createFromFormat('M j, Y H:i:s', 'Jan 2, 2016 15:03:24');
DateInterval类
DateInterval实例表示长度固定的时间段(例如“两天”),或者相对而言的时间段(例如“昨天”)。DateInterval实例用于修改DateTime实例。例如DateTime类提供了add()
和sub()
两个方法,这两个方法的参数都是DateInterval实例,指定要添加到DateTime实例的时间量,或要从DateTime实例中减去的时间量。
DateInterval类构造方法的参数是一个表示间隔规格的字符串。间隔规格是一个以“P”开头的字符串,后面接一个整数,最后是一个周期标识符,限定前面的整数。有效的周期标识符有:
- Y(年)
- M(月)
- D(日)
- W(周)
- H(时)
- M(分)
- S(秒)
间隔规格中既可以有日期也可以有时间,如果两者都有,需要在两者中间加上“T”。例如“P2D”表示2天,P2DT1H2M
表示2天1小时2分钟。下面一个例子通过给DateTime的add()
方法传递了DateInterval实例来修改DateTime实例表示的日期。
<?php
$datetime = new DateTime('2014-04-27 5:03 AM');
$interval = new DateInterval('P2W');
$datetime->add($interval);
// Output: 2014-05-11 05:03:00
echo $datetime->format('Y-m-d H:i:s');
DateTimeZone类
DateTime类构造方法还存在第二个参数,为一个DateTimeZone实例,表示的是时区。DateTimeZone实例可以有DateTimeZone类构造方法生成,需要传递给构造方法一个有效的时区标志。
<?php
$timezone = new DateTimeZone('Asia/Shanghai');
$datetime = new DateTime('2014-04-27 5:03 AM', $timezone);
$datetime->setTimezone(new DateTimeZone('Asia/Tokyo'));
DatePeriod类
当我们需要迭代处理相同间隔的一系列日期和时间时,我们可以使用DatePeriod类。DatePeriod类的构造方法必须提供3个参数:
- 一个DateTime实例,表示开始的日期和时间
- 一个DateInterval实例,表示时间间隔
- 一个整数,表示迭代的次数
DatePeriod的实例是一个迭代器每次迭代都会产生一个DateTime实例。
<?php
$datetime = new DateTime('2014-04-27 5:03 AM');
$interval = new DateInterval('P2W');
$period = new DatePeriod($datetime, $interval, 3);
foreach ($period as $next) {
echo $next->format('Y-m-d H:i:s').PHP_EOL;
}
ModernPHP 系列全集:传送门