当前位置:首页 > php > 你不知道PHP的DateTime类坑点

你不知道PHP的DateTime类坑点

原创 2020-06-02 php 811
分享给朋友:

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类的时候,当出现多个未来或者过去时间的计算,请注意初始的对象之是否已经改变!

声明:版权所有,违者必究 | 如未注明,均为原创 | 本网站采用 BY-NC-SA 协议进行授权

转载:转载请注明原文链接,违者必究 - :https://www.wolfcode.net/info/186/

分享给朋友:

相关文章

webman自定义进程

1、新建文件 process/Rpc.php 编写rpc进程<?php namespace process; use Workerman\Connection\TcpConnection; class Rpc {    &n

在PHP7+下监控Memcached服务、性能、扇区等信息

PHPMemcachedAdmin:一款网页可视化的Memcached工具

Swoole的PHP协程开发框架 imi 集成ThinkPHP模板引擎 think-template

在 imi 框架根目录中执行composer require topthink/think-template安装好模板引擎后,找到路径\vendor\topthink\think-template\src\Template.php找到 fetch() 渲染模板文件的方法,将最后一

PHP7下MongoDB自增或自减一个字段的值

findAndModify属于原子操作模型数据,所谓原子操作就是要么这个文档保存到Mongodb,要么没有保存到Mongodb,不会出现查询到的文档没有保存完整的情况。

PHP的面向对象解析

早期编程由于受电脑硬件限制,程序都是追求效率,而忽略可理解性,扩充性,随着硬件技术的发展,编程越来越重视多人开发,程序员越来越重视程序的可靠性,可扩展性,可维护性,所以刺激了程序语言的发展

ThinkPHP6.0使用EasyTask常驻内存多进程任务管理

PHP常驻内存的多进程任务管理器Composer包。以进程管理为出发点,同时也支持为每个进程设置定时执行功能,您可以用它来完成需要重复运行的任务(如订单超时自动取消,短信邮件异步推送,队列/消费者/频道订阅者等等),甚至处理计划任务。

PHP8新特性盘点

PHP 8.0.0 已经正式发布了,这个对于PHPer无疑是一个令人振奋的消息。它包含了很多新功能与优化项, 包括命名参数、联合类型、注解、构造器属性提升、match表达式、nullsafe运算符、JIT,并改进了类型系统、错误处理、语法一致性。

PHP8新特性系列:构造器属性提升使用及注意事项

本篇主要说下PHP8构造器属性提升的用法,这个特性对于一些需要在构造器中设置或初始化一些类属性的时候非常有用(包括public、protected和private),比如在PHP7中你可以这样定义一个类的属性,然后在构造方法中传值。class Point {  &nb

ThinkPHP6.0在PHP8下报错解决方法

PHP8下全新安装ThinkPHP6.0.X出现报错,如下Deprecated: Method ReflectionParameter::getClass() is deprecated in xxxx\vendor\topthink\fr

MongoDB驱动聚合查询aggregate在分组分页排序后出现的数据混乱问题

最近在获取MongoDB数据时需要把重复的数据分组来排序,语言版本:PHP7