/ php

ModernPHP 密码与时间相关

密码

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 系列全集:传送门