如何使用PHP计算上一个月的今天


Posted in PHP onMay 23, 2013

一日,遇到一个问题,求上一个月的今天。 最开始我们使用 strtotime(”-1 month”) 函数求值,发现有一个问题,月长度不一样的月份的计算结果有误。 比如:2011-03-31,得到的结果是2011-03-03。我们先不追究什么问题,先看如何解决问题。 此时,想起PHP中有一个mktime函数,于是自己写了如下代码:

echo date("Y-m-d H:i:s", mktime(date("G", $time), date("i", $time),
 date("s", $time), date("n", $time) - 1, date("j", $time), date("Y", $time)));

当执行时,发现结果和strtotime的结果是一样的。
还是基于这个函数,既然无法直接操作月,那么我们从天入手,得到上一个月,然后再使用date拼接数据。如下代码:
$time = strtotime("2011-03-31");
/**
 * 计算上一个月的今天
 * @param type $time
 * @return type
 */
function last_month_today($time) {
     $last_month_time = mktime(date("G", $time), date("i", $time),
                date("s", $time), date("n", $time), - 1, date("Y", $time));
     return date(date("Y-m", $last_month_time) . "-d H:i:s", $time);
}
echo last_month_today($time);

但是此时又有了另一个问题,不存在2011-02-31这样的日期,怎么办?现在的需求是对于这样的日期显示当月最后一天。 如下代码:
 $time = strtotime("2011-03-31");
/**
 * 计算上一个月的今天,如果上个月没有今天,则返回上一个月的最后一天
 * @param type $time
 * @return type
 */
function last_month_today($time){
    $last_month_time = mktime(date("G", $time), date("i", $time),
                date("s", $time), date("n", $time), 0, date("Y", $time));
    $last_month_t =  date("t", $last_month_time);
    if ($last_month_t < date("j", $time)) {
        return date("Y-m-t H:i:s", $last_month_time);
    }
    return date(date("Y-m", $last_month_time) . "-d", $time);
}
echo last_month_today($time);

这里需要注意一点: date(”Y-m”, $last_month_time) . “-d”这段代码。在写代码的过程中如果写成了 “Y-” . date(”m”, $last_month_time) . “-d” 则在跨年的时间上有问题。 这点还是在写这篇文章时发现的。
除了这种方法,还可以先算出年月日再拼接字符串,这里就是纯粹的字符串操作了。
PHP 相关文章推荐
基于mysql的论坛(3)
Oct 09 PHP
第十一节--重载
Nov 16 PHP
PHP 数字左侧自动补0
Mar 31 PHP
PHP中的integer类型使用分析
Jul 27 PHP
php获取网页请求状态程序示例
Jun 17 PHP
php的sso单点登录实现方法
Jan 08 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
Dec 12 PHP
yii2项目实战之restful api授权验证详解
May 20 PHP
Django中的cookie与session操作实例代码
Aug 17 PHP
PHP使用标准库spl实现的观察者模式示例
Aug 04 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
Dec 01 PHP
PHP 实现重载
Mar 09 PHP
解析php二分法查找数组是否包含某一元素
May 23 #PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
May 23 #PHP
php设计模式之观察者模式的应用详解
May 21 #PHP
php设计模式之命令模式的应用详解
May 21 #PHP
浅谈PHP与C#的值类型指向区别的详解
May 21 #PHP
PHP无法访问远程mysql的问题分析及解决
May 16 #PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
May 15 #PHP
You might like
探讨如何在PHP开启gzip页面压缩实例
2013/06/09 PHP
用jquery实现自定义风格的滑动条实现代码
2011/04/26 Javascript
javascript 获取网页标题代码实例
2014/01/22 Javascript
javascript日期格式化示例分享
2014/03/05 Javascript
使用CSS+JavaScript或纯js实现半透明遮罩效果的实例分享
2016/05/09 Javascript
简单实现js浮动框
2016/12/13 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
2016/12/14 Javascript
jQuery is not defined 错误原因与解决方法小结
2017/03/19 Javascript
详解Angular之constructor和ngOnInit差异及适用场景
2017/06/22 Javascript
AngularJS实现的JSONP跨域访问数据传输功能详解
2017/07/20 Javascript
JavaScript数据结构之单链表和循环链表
2017/11/28 Javascript
Vue+Flask实现简单的登录验证跳转的示例代码
2018/01/13 Javascript
原生JS实现多个小球碰撞反弹效果示例
2018/01/31 Javascript
微信小程序新手教程之启动页的重要性
2019/03/03 Javascript
vue柱状进度条图像的完美实现方案
2019/08/26 Javascript
layui实现图片虚拟路径上传,预览和删除的例子
2019/09/25 Javascript
js实现三角形粒子运动
2020/09/22 Javascript
django model去掉unique_together报错的解决方案
2016/10/18 Python
Django如何配置mysql数据库
2018/05/04 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
2019/01/02 Python
Python @property使用方法解析
2019/09/17 Python
Django app配置多个数据库代码实例
2019/12/17 Python
Python实现链表反转的方法分析【迭代法与递归法】
2020/02/22 Python
Python多线程正确用法实例解析
2020/05/30 Python
css3中仿放大镜效果的几种方式原理解析
2020/12/03 HTML / CSS
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
2013/01/30 HTML / CSS
手摸手教你用canvas实现给图片添加平铺水印的实现
2019/08/20 HTML / CSS
西班牙英格列斯百货法国官网:El Corte Inglés法国
2017/07/09 全球购物
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
《美丽的小路》教学反思
2014/02/26 职场文书
简单的个人租房协议书范本
2014/11/26 职场文书
会计出纳岗位职责
2015/03/31 职场文书
复活读书笔记
2015/06/29 职场文书
升学宴来宾致辞
2015/07/27 职场文书
Redis安装启动及常见数据类型
2021/04/14 Redis
pytorch常用数据类型所占字节数对照表一览
2021/05/17 Python