如何使用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 相关文章推荐
DISCUZ 分页代码
Jan 02 PHP
PHP6 先修班 JSON实例代码
Aug 23 PHP
2个比较经典的PHP加密解密函数分享
Jul 01 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
Oct 30 PHP
php中实现可以返回多个值的函数实例
Mar 21 PHP
ThinkPHP进程计数类Process用法实例详解
Sep 25 PHP
替换php字符串中的单引号为双引号的方法
Feb 16 PHP
PHP错误处理函数register_shutdown_function使用示例
Jul 03 PHP
浅谈php的TS和NTS的区别
Mar 13 PHP
PHP命名空间定义与用法实例分析
Aug 14 PHP
laravel excel 上传文件保存到本地服务器功能
Nov 14 PHP
PHP生成随机密码4种方法及性能对比
Dec 11 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来处理多个提交任务
2008/05/08 PHP
php程序员应具有的7种能力小结
2014/11/27 PHP
Smarty最简单实现列表奇偶变色的方法
2015/07/01 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
2015/07/29 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
2020/04/26 PHP
javascript基础的动画教程,直观易懂
2007/01/10 Javascript
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
基于JQuery的浮动DIV显示提示信息并自动隐藏
2011/02/11 Javascript
jquery实现的一个简单进度条效果实例
2014/05/12 Javascript
js动态添加表格数据使用insertRow和insertCell实现
2014/05/22 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
12306验证码破解思路分享
2015/03/25 Javascript
AngularJS  $modal弹出框实例代码
2016/08/24 Javascript
使用Node.js实现简易MVC框架的方法
2017/08/07 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
Electron 如何调用本地模块的方法
2019/02/01 Javascript
vue-cli中使用高德地图的方法示例
2019/03/28 Javascript
js获取浏览器地址(获取第1个斜杠后的内容)
2019/09/03 Javascript
Python设计实现的计算器功能完整实例
2017/08/18 Python
微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧
2018/01/04 Python
对json字符串与python字符串的不同之处详解
2018/12/19 Python
python中time库的实例使用方法
2019/10/31 Python
python双端队列原理、实现与使用方法分析
2019/11/27 Python
CSS3教程(6):创建网站多列
2009/04/02 HTML / CSS
加拿大女鞋品牌:ALDO
2016/11/13 全球购物
Sperry澳大利亚官网:源自美国帆船鞋创始品牌
2019/07/29 全球购物
存储过程和函数的区别
2013/05/28 面试题
金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)-> (一千零一拾一元整)输出
2015/05/29 面试题
表彰会主持词
2014/03/26 职场文书
临时租车协议范本
2014/09/23 职场文书
2019年工作总结范文
2019/05/21 职场文书
女人创业励志语录,句句蕴含能量,激发你的潜能
2019/08/20 职场文书
MySQL 分页查询的优化技巧
2021/05/12 MySQL
室外天线与收音机天线杆接合方法
2022/04/05 无线电
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技