如何使用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 Ajax实现页面无刷新发表评论
Jan 02 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
Mar 11 PHP
php用户注册时常用的检验函数实例总结
Dec 22 PHP
php实现遍历目录并删除指定文件中指定内容
Jan 21 PHP
PHP会话处理的10个函数
Aug 11 PHP
WordPress中使主题支持小工具以及添加插件启用函数
Dec 22 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
Dec 24 PHP
PHP面向对象程序设计实例分析
Jan 26 PHP
PHP使用file_get_content设置头信息的方法
Feb 14 PHP
php通过curl添加cookie伪造登陆抓取数据的方法
Apr 02 PHP
PHPStorm+XDebug进行调试图文教程
Jun 13 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
Jun 03 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的access操作类
2008/04/09 PHP
golang、python、php、c++、c、java、Nodejs性能对比
2017/03/12 NodeJs
php求数组全排列,元素所有组合的方法总结
2017/03/14 PHP
PHP测试框架PHPUnit组织测试操作示例
2018/05/28 PHP
js 利用className得到对象的实现代码
2011/11/15 Javascript
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
JavaScript实现在页面间传值的方法
2015/04/07 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
详解JavaScript中的事件流和事件处理程序
2016/05/20 Javascript
javascript表单正则应用
2017/02/04 Javascript
详解nodejs微信jssdk后端接口
2017/05/25 NodeJs
Vue.js常用指令之循环使用v-for指令教程
2017/06/27 Javascript
vue.js学习之UI组件开发教程
2017/07/03 Javascript
JQ图片文件上传之前预览功能的简单实例(分享)
2017/11/12 Javascript
Vue添加请求拦截器及vue-resource 拦截器使用
2017/11/23 Javascript
element中table高度自适应的实现
2020/10/21 Javascript
Python备份目录及目录下的全部内容的实现方法
2016/06/12 Python
利用python实现简单的循环购物车功能示例代码
2017/07/05 Python
python和ruby,我选谁?
2017/09/13 Python
基于numpy.random.randn()与rand()的区别详解
2018/04/17 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
2019/01/22 Python
python 多线程重启方法
2019/02/18 Python
python快排算法详解
2019/03/04 Python
使用虚拟环境打包python为exe 文件的方法
2019/08/29 Python
python3 Scrapy爬虫框架ip代理配置的方法
2020/01/17 Python
python列表切片和嵌套列表取值操作详解
2020/02/27 Python
python程序实现BTC(比特币)挖矿的完整代码
2021/01/20 Python
HTML5自定义视频播放器源码
2020/01/06 HTML / CSS
华美博弈C/VC工程师笔试试题
2012/07/16 面试题
创业计划书六个要素
2013/12/26 职场文书
西式婚礼主持词
2014/03/13 职场文书
计算机专业自荐信
2015/03/05 职场文书
求职导师推荐信范文
2015/03/27 职场文书
2015年端午节活动策划书
2015/05/05 职场文书
施工安全责任协议书
2016/03/23 职场文书
react中的DOM操作实现
2021/06/30 Javascript