如何使用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 相关文章推荐
php 删除记录实现代码
Mar 12 PHP
一些php技巧与注意事项分析
Feb 03 PHP
php中对2个数组相加的函数
Jun 24 PHP
PHP实现图片压缩的两则实例
Jul 19 PHP
php缩放gif和png图透明背景变成黑色的解决方法
Oct 14 PHP
php转换颜色为其反色的方法
Apr 27 PHP
php的debug相关函数用法示例
Jul 11 PHP
php实现给二维数组中所有一维数组添加值的方法
Feb 04 PHP
php批量修改表结构实例
May 24 PHP
php中如何执行linux命令详解
Nov 06 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
Oct 09 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
Sep 15 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
帅气的琦玉老师
2020/03/02 日漫
php5新改动之短标记启用方法
2008/09/11 PHP
Discuz Uchome ajaxpost小技巧
2011/01/04 PHP
PHP的autoload机制的实现解析
2012/09/15 PHP
PHP开发框架Laravel数据库操作方法总结
2014/09/03 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
2021/02/22 PHP
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
2011/02/23 Javascript
javascript动态控制服务器控件实例
2014/09/05 Javascript
jquery实现鼠标滑过小图时显示大图的方法
2015/01/14 Javascript
JavaScript中数据结构与算法(五):经典KMP算法
2015/06/19 Javascript
基于JS实现checkbox全选功能实例代码
2016/10/31 Javascript
利用JS实现页面删除并重新排序功能
2016/12/09 Javascript
原生js实现简单的Ripple按钮实例代码
2017/03/24 Javascript
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
angular指令笔记ng-options的使用方法
2017/09/18 Javascript
jQuery动态添加元素无法触发绑定事件的解决方法分析
2018/01/02 jQuery
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
微信小程序scroll-view实现滚动到锚点左侧导航栏点餐功能(点击种类,滚动到锚点)
2020/06/11 Javascript
Vue js with语句原理及用法解析
2020/09/03 Javascript
介绍Python的@property装饰器的用法
2015/04/28 Python
详解Python中的测试工具
2019/06/09 Python
opencv 阈值分割的具体使用
2020/07/08 Python
CSS3 实现footer 固定在底部(无论页面多高始终在底部)
2019/10/15 HTML / CSS
高清屏下canvas重置尺寸引发的问题的解决
2019/10/14 HTML / CSS
俄罗斯品牌服装在线商店:VIPAVENUE
2020/08/10 全球购物
澳大利亚电商Catch新西兰站:Catch.co.nz
2020/05/30 全球购物
材料加工硕士生求职信
2013/10/10 职场文书
见习期自我鉴定
2013/11/07 职场文书
学术研讨会欢迎词
2015/01/26 职场文书
茶楼服务员岗位职责
2015/02/09 职场文书
2015年公司行政后勤工作总结
2015/05/20 职场文书
单位工资证明范本
2015/06/12 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
Ajax请求超时与网络异常处理图文详解
2021/05/23 Javascript
MySQL数据库查询之多表查询总结
2022/08/05 MySQL