如何使用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的5个安全措施小结
Jul 17 PHP
探讨file_get_contents与curl效率及稳定性的分析
Jun 06 PHP
利用php绘制饼状图的实现代码
Jun 07 PHP
Php output buffering缓存及程序缓存深入解析
Jul 15 PHP
php使用curl访问https示例分享
Jan 17 PHP
php简单的留言板与回复功能具体实现
Feb 19 PHP
php实现用于计算执行时间的类实例
Apr 18 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
Mar 22 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
Apr 20 PHP
PHP+redis实现的悲观锁机制示例
Jun 12 PHP
PHP实现微信商户支付企业付款到零钱功能
Sep 30 PHP
PHP连续签到功能实现方法详解
Dec 04 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
浅析Apache中RewriteCond规则参数的详细介绍
2013/06/30 PHP
php格式化金额函数分享
2015/02/02 PHP
PHP批量获取网页中所有固定种子链接的方法
2016/11/18 PHP
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
javascript实现动态侧边栏代码
2014/02/19 Javascript
jquery删除数据记录时的弹出提示效果
2014/05/06 Javascript
给js文件传参数(详解)
2014/07/13 Javascript
js图片闪动特效可以控制间隔时间如几分钟闪动一下
2014/08/12 Javascript
javascript将DOM节点添加到文档的方法实例分析
2015/08/04 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
深入理解Javascript中的自执行匿名函数
2016/06/03 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
2016/12/08 Javascript
从零学习node.js之mysql数据库的操作(五)
2017/02/24 Javascript
Angularjs分页查询的实现
2017/02/24 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
2018/03/17 Javascript
vue项目中vue-i18n和element-ui国际化开发实现过程
2018/04/25 Javascript
jQuery实现当拉动滚动条到底部加载数据的方法分析
2019/01/24 jQuery
React+TypeScript+webpack4多入口配置详解
2019/08/08 Javascript
微信jssdk踩坑之签名错误invalid signature
2020/05/19 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
2020/09/21 Javascript
vue 页面跳转的实现方式
2021/01/12 Vue.js
Python中返回字典键的值的values()方法使用
2015/05/22 Python
pyenv命令管理多个Python版本
2017/03/26 Python
python线程池threadpool使用篇
2018/04/27 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
2019/06/05 Python
Python 脚本的三种执行方式小结
2019/12/21 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
2020/05/11 Python
介绍下WebSphere的安全性
2013/01/31 面试题
后勤园长自我鉴定
2013/10/17 职场文书
本科毕业生自我鉴定
2013/11/02 职场文书
社区志愿者心得体会
2014/01/03 职场文书
年度考核自我评价
2014/01/25 职场文书
网站推广策划方案
2014/06/04 职场文书
车辆委托书范本
2014/10/05 职场文书
2014年新农村建设工作总结
2014/12/01 职场文书
2016计划生育先进个人事迹材料
2016/02/29 职场文书