如何使用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语法速查表
Dec 06 PHP
nginx+php-fpm配置文件的组织结构介绍
Nov 07 PHP
PHP不用递归实现无限分级的例子分享
Apr 18 PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
Jul 01 PHP
ThinkPHP模板之变量输出、自定义函数与判断语句用法
Nov 01 PHP
php中simplexml_load_file函数用法实例
Nov 12 PHP
PHP滚动日志的代码实现
Jun 10 PHP
php制作的简单验证码识别代码
Jan 26 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
Jul 14 PHP
PHP二进制与字符串之间的相互转换教程
Oct 14 PHP
phpStudy中升级MySQL版本到5.7.17的方法步骤
Aug 03 PHP
PHP __call()方法实现委托示例
May 20 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 获取客户端真实IP地址多种方法小结
2010/05/15 PHP
PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
2012/06/07 PHP
关于php 高并发解决的一点思路
2017/04/16 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
2017/10/11 PHP
js网页版计算器的简单实现
2013/07/02 Javascript
解析dom中的children对象数组元素firstChild,lastChild的使用
2013/07/10 Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
2014/07/18 Javascript
jQuery中is()方法用法实例
2015/01/06 Javascript
推荐10 个很棒的 jQuery 特效代码
2015/10/04 Javascript
js实现简单的省市县三级联动效果实例
2016/02/18 Javascript
使用JS中的exec()方法构造正则表达式验证
2016/08/01 Javascript
微信小程序 es6-promise.js封装请求与处理异步进程
2017/06/12 Javascript
JS实现页面内跳转的简单代码
2017/09/03 Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
2018/08/06 Javascript
在Vue methods中调用filters里的过滤器实例
2018/08/30 Javascript
js实现图片跟随鼠标移动效果
2019/10/16 Javascript
[41:17]VG vs Optic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python中from module import * 的一个坑
2014/07/20 Python
优化Python代码使其加快作用域内的查找
2015/03/30 Python
Python+Socket实现基于UDP协议的局域网广播功能示例
2017/08/31 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
2018/06/26 Python
python脚本监控Tomcat服务器的方法
2018/07/06 Python
详解Python 中的容器 collections
2020/08/17 Python
Html5+JS实现手机摇一摇功能
2015/04/24 HTML / CSS
Myprotein芬兰官网:欧洲第一运动营养品牌
2019/05/05 全球购物
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
写好求职信第一句话的技巧
2013/10/26 职场文书
网络专业学生个人的自我评价
2013/12/16 职场文书
心理健康教育制度
2014/01/27 职场文书
计算机专业毕业生自荐信范文
2014/03/06 职场文书
新闻发布会策划方案
2014/06/12 职场文书
城市创卫标语
2014/06/17 职场文书
团队拓展活动方案
2014/08/28 职场文书
2015年小学体育工作总结
2015/05/22 职场文书
幼儿园园长六一致辞
2015/07/31 职场文书
nginx location 带斜杠【 / 】与不带的区别
2022/04/13 Servers