如何使用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 相关文章推荐
PHP6 mysql连接方式说明
Feb 09 PHP
apache+php+mysql安装配置方法小结
Aug 01 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
Jul 01 PHP
php页面防重复提交方法总结
Nov 25 PHP
php导出csv格式数据并将数字转换成文本的思路以及代码分享
Jun 05 PHP
ThinkPHP模板Switch标签用法示例
Jun 30 PHP
PHP加密3DES报错 Call to undefined function: mcrypt_module_open() 如何解决
Apr 17 PHP
利用php生成验证码
Feb 23 PHP
Laravel 5.4向IoC容器中添加自定义类的方法示例
Aug 15 PHP
PHP 二维array转换json的实例讲解
Aug 21 PHP
PHP二维索引数组的遍历实例分析【2种方式】
Jun 24 PHP
PHP批斗大会之缺失的异常详解
Jul 09 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统计目录下的文件总数及代码行数(去除注释及空行)
2011/01/17 PHP
thinkphp如何获取客户端IP
2015/11/03 PHP
关于PHP中Session文件过多的问题及session文件保存位置
2016/03/17 PHP
php similar_text()函数的定义和用法
2016/05/12 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
JavaScript脚本性能的优化方法
2007/02/02 Javascript
40款非常棒的jQuery 插件和制作教程(系列二)
2011/11/02 Javascript
拥抱模块化的JavaScript
2012/03/07 Javascript
jquery入门必备的基本认识及实例(整理)
2013/06/24 Javascript
jQuery中filter()和find()的区别深入了解
2013/09/25 Javascript
jquery获取元素索引值index()示例
2014/02/13 Javascript
js实现键盘操作实现div的移动或改变的原理及代码
2014/06/23 Javascript
基于Vue.js实现数字拼图游戏
2016/08/02 Javascript
vue.js入门(3)——详解组件通信
2016/12/02 Javascript
从零学习node.js之文件操作(三)
2017/02/21 Javascript
Angular实现购物车计算示例代码
2017/02/21 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
Vue 将后台传过来的带html字段的字符串转换为 HTML
2018/03/29 Javascript
老生常谈JavaScript获取CSS样式的方法(兼容各浏览器)
2018/09/19 Javascript
使用webpack打包后的vue项目如何正确运行(express)
2018/10/26 Javascript
微信小程序使用二次贝塞尔曲线画波浪
2018/12/25 Javascript
Vue之Mixins(混入)的使用方法
2019/09/24 Javascript
jstree中的checkbox默认选中和隐藏示例代码
2019/12/29 Javascript
原生js无缝轮播插件使用详解
2020/03/09 Javascript
详解在Python的Django框架中创建模板库的方法
2015/07/20 Python
python 写入csv乱码问题解决方法
2016/10/23 Python
使用Python快乐学数学Github万星神器Manim简介
2019/08/07 Python
python中property属性的介绍及其应用详解
2019/08/29 Python
Python scipy的二维图像卷积运算与图像模糊处理操作示例
2019/09/06 Python
python 星号(*)的多种用途
2020/09/21 Python
HTML5拖拉上传文件的简单实例
2017/01/11 HTML / CSS
英国时尚配饰、珠宝和服装网站:KJ Beckett
2020/01/23 全球购物
高三学生评语大全
2014/04/25 职场文书
《鸟岛》教学反思
2014/04/26 职场文书
师德师风心得体会(2016精选篇)
2016/01/12 职场文书
如何使用Python提取Chrome浏览器保存的密码
2021/06/09 Python