PHP日期时间处理方法总结

总结

PHP 大于 7.0 版本优先使用 **DateTime** 类,与原 date()、strtotime()、gmdate() 等函数等效。
DateIntervelDateTimeZoneDatePeriod 等相关类配合完成对日期和时间的处理。

DateTime 类

创建实例

//构造方法实例化
// DateTime::__construct ([ string $time = "now" [, DateTimeZone $timezone = NULL ]] )
$date1 = new DateTime('2021-10-01 00:00:00');
//面向过程风格
$date1 = date_create('2021-10-01 00:00:00');

//静态方法创建
// DateTime::createFromFormat ( string $format , string $time [, DateTimeZone $timezone ] )
$date2 = DateTime::createFromFormat('Y-m-d H:i:s','2021-10-01 00:00:00');
//面向过程风格
$date2 = date_create('2021-10-01 00:00:00');
date_format($date, 'Y-m-d H:i:s');

格式化

echo $date1->format('Y-m-d H:i:s'); //2021-10-01 00:00:00
echo $date1->format('Y-m-d'); //2021-10-01
//format 参数参考官方文档
//https://www.php.net/manual/zh/datetime.format.php

修改对象值

//方法一
//DateTime::modify ( string $modify ) : DateTime
$date = new DateTime('2021-10-01');
$date->modify('+1 day');
echo $date->format('Y-m-d'); //2021-10-02
//面向过程风格
$date = date_create('2021-10-01');
date_modify($date, '+1 day');
echo date_format($date, 'Y-m-d');//2021-10-02

//方法二
$date = new DateTime('2021-10-01');
// add方法
$date->add(new DateInterval('P1D'));
echo $date->format('Y-m-d H:i:s');//2021-10-02
// sub方法
$date->sub(new DateInterval('P1D'));
echo $date->format('Y-m-d H:i:s');//2021-09-30

//方法三
$date->setDate(2021, 10, 1);
echo $date->format('Y-m-d');//2021-10-02

DateInterval 表示长度固定的时间段(比如两天),或者相对而言的时间段(例如昨天),我们通常使用该类的实例来修改DateTime实例

$date = new DateTime('2021-10-01');
$date->add(new DateInterval('P10D'));
echo $date->format('Y-m-d H:i:s');//2021-10-11

DateTime提供了用于处理DateTime实例的`add`和`sub`方法,这两个方法的参数是一个DateInterval实例,表示从DateTime中增加的时间量或减少的时间量。
DateInterval构造函数的参数是一个表示时间间隔约定的字符串,这个时间间隔约定以字母P开头,后面跟着一个整数,最后是一个周期标识符,限定前面的整数。有效周期标识符如下:
– Y(年)
– M(月)
– D(日)
– W(周)
– H(时)
– M(分)
– S(秒)
间隔约定中既可以有时间也可以有日期,如果有时间需要在日期和时间之间加上字母T,例如,间隔约定P2D表示间隔两天,间隔约定P1DT5H2M表示间隔一天五小时两分钟。

strtotime 函数

strtotime() 函数将任何英文文本的日期时间描述解析为 Unix 时间戳。在date_modify、DateTime::modify等都可以使用。

//strtotime ( string $time [, int $now = time() ] ) : int
$time = strtotime("now");// 获取当前的时间戳
echo $time; //1633069845
echo strtotime("+5 hours"); // 当前时间加五个小时 1633087845

//参考示例
echo date("Y-m-d",time());//今天
echo date("Y-m-d",strtotime("-1 day")); //昨天
echo date("Y-m-d",strtotime("+1 day"));//明天
echo date("Y-m-d",strtotime("+1 week"));//一周后
echo date("Y-m-d G:H:s",strtotime("+1 week 2 days 4 hours 2 seconds"));//一周零两天四小时两秒后
echo date("Y-m-d",strtotime("next Thursday"));//下个星期四
echo date("Y-m-d",strtotime("last Monday"));//上个周一
echo date("Y-m-d",strtotime("last month"));//一个月前
echo date("Y-m-d",strtotime("+1 month"));//一个月后
echo date("Y-m-d",strtotime("+10 year"));//十年后
echo date("Y-m-d",strtotime("12 month ago"));//十二个月前

时间参数

– am(上午)
– pm(下午)
– year: “next year” 明年
– month : “last month” 上个月
– fortnight(两周) : “a fortnight ago” 两周前
– week
– day
– hours
– minute
– second或者 sec

计算顺序

ago 从当前时间往前计算
– “24 hours ago”(hour也可以)
– “3 years ago”(year也可以)
– “12 month ago”
– first-twelfth(连续的)
– last
– next
– previos

DatePeriod类

DatePeriod是迭代器,每次迭代都会产出一个DateTime实例。

$datetime = new DateTime('2021-10-01');
$interval = new DateInterval('P10D');
$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;
}
// 输出
//2021-10-01
//2021-10-11
//2021-10-21

发表评论