PHP的DateTime主要功能是用来处理日期和时间,日常中用起来也很方便

输出当前时间

$datetime = new \DateTime;
print_r($datetime->format('Y-m-d H:i:s'));

 这里主要讲一下有些小伙伴在使用DateTime类中可能会出现的一些误区!

先来看一个需求:(获取指定时间的1分钟后的时间)

代码也很简单

$time = "2020-06-01 10:00:00"; // 指定的时间
$datetime = new \DateTime($time);
$nextminute = $datetime->modify('+1 minute');
print_r($nexttime->format('Y-m-d H:i:s'));
// 输出 "2020-06-01 10:01:00"

上面这样没问题!

来看一个新的需求(根据指定时间,同时获取1分钟后和1个月后的时间)

代码直接复制上面,很多人会这样写

$time = "2020-06-01 10:00:00"; // 指定的时间
$datetime = new \DateTime($time);
$nextminute = $datetime->modify('+1 minute');
print_r($nextminute->format('Y-m-d H:i:s'));
// 输出 "2020-06-01 10:01:00"
$nextmonth = $datetime->modify('+1 month');
print_r($nextmonth->format('Y-m-d H:i:s'));
// 理想输出 "2020-07-01 10:00:00"
// 实际输出 "2020-07-01 10:01:00"

why?为什么下个月的时间多了1分钟?


这其实是一个坑!可能很多人不理解,其实这个时候的$datetime已经不是最早的那个$datetime了,它变了...

这时候的$datetime对象已经被$nextminute腐蚀了,也就是初始值已经是$nextminute的值了。

可以在$nextmonth之前打印出$datetime对象观察

DateTime @1590976860 {#249 ▼
  date: 2020-06-01 10:01:00.0 Asia/Shanghai (+08:00)}

所以,项目中如果有时候DateTime类的时候,当出现多个未来或者过去时间的计算,请注意初始的对象之是否已经改变!

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开微信扫一扫,即可进行扫码打赏哦

分享到
  • QQ好友
  • 微信好友
  • 新浪微博