如何使用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中文输出变成问号的问题
Jun 05 PHP
DedeCMS dede_channeltype表字段注释
Apr 07 PHP
php getimagesize 上传图片的长度和宽度检测代码
May 15 PHP
php日期转时间戳,指定日期转换成时间戳
Jul 17 PHP
php中stream(流)的用法
Mar 25 PHP
PHP以mysqli方式连接类完整代码实例
Jul 15 PHP
php转换颜色为其反色的方法
Apr 27 PHP
php正则替换处理HTML页面的方法
Jun 17 PHP
UTF-8正则表达式如何匹配汉字
Aug 03 PHP
PHP安全下载文件的方法
Apr 07 PHP
thinkPHP数据库增删改查操作方法实例详解
Dec 06 PHP
PHP实现创建微信自定义菜单的方法示例
Jul 14 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/04 星际争霸
ThinkPHP表单数据智能写入create方法实例分析
2015/09/27 PHP
php实现网站文件批量压缩下载功能
2015/10/28 PHP
PHP中的静态变量及static静态变量使用详解
2015/11/05 PHP
JavaScript的面向对象(一)
2006/11/09 Javascript
JS实现self的resend
2010/07/22 Javascript
nodejs入门详解(多篇文章结合)
2012/03/07 NodeJs
jQuery-onload让第一次页面加载时图片是淡入方式显示
2012/05/23 Javascript
事件冒泡是什么如何用jquery阻止事件冒泡
2013/03/20 Javascript
jquery仿京东导航/仿淘宝商城左侧分类导航下拉菜单效果
2013/04/24 Javascript
简体中文转换繁体中文(实现代码)
2013/12/25 Javascript
js中hash和ico的关联分析
2015/02/05 Javascript
js改变embed标签src值的方法
2015/04/10 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
nodejs的HTML分析利器node-jquery用法浅析
2016/11/08 NodeJs
JavaScript实现动态增删表格的方法
2017/03/09 Javascript
vue.js指令和组件详细介绍及实例
2017/04/06 Javascript
简单实现jQuery弹幕效果
2017/05/06 jQuery
Javascript实现时间倒计时功能
2018/11/17 Javascript
Vue运用transition实现过渡动画
2019/05/06 Javascript
Openlayers绘制聚合标注
2020/09/28 Javascript
Python单链表的简单实现方法
2014/09/23 Python
将Python中的数据存储到系统本地的简单方法
2015/04/11 Python
Python聚类算法之DBSACN实例分析
2015/11/20 Python
Django实现快速分页的方法实例
2017/10/22 Python
python使用sqlite3时游标使用方法
2018/03/13 Python
python如何对实例属性进行类型检查
2018/03/20 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
英国天然宝石首饰购买网站:Gemondo Jewellery
2018/10/23 全球购物
瑞士网球商店:Tennis-Point
2020/03/12 全球购物
大学军训感言
2014/01/10 职场文书
大宝sod蜜广告词
2014/03/21 职场文书
邻里守望志愿服务活动方案
2014/08/15 职场文书
党员评议个人总结
2014/10/20 职场文书
实战 快速定位MySQL的慢SQL
2022/03/22 MySQL
在 Python 中利用 Pool 进行多线程
2022/04/24 Python