如何使用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聊天室技术
Oct 09 PHP
PHP 截取字符串 分别适合GB2312和UTF8编码情况
Feb 12 PHP
PHP register_shutdown_function函数的深入解析
Jun 03 PHP
深入eAccelerator与memcached的区别详解
Jun 06 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
Apr 09 PHP
php获取从html表单传递数组的方法
Mar 20 PHP
PHP的Yii框架的常用日志操作总结
Dec 08 PHP
ThinkPHP框架安全实现分析
Mar 14 PHP
PHP自定义函数获取URL中一级域名的方法
Aug 23 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
May 20 PHP
php简单计算权重的方法示例【适合抽奖类应用】
Jun 10 PHP
Laravel的加密解密与哈希实例讲解
Mar 24 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 XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
php字符串截取函数用法分析
2014/11/25 PHP
PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
2015/09/30 PHP
加载jQuery后$冲突的解决办法
2010/07/09 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
jQuery中val()方法用法实例
2014/12/25 Javascript
javascript实现 百度翻译 可折叠的分享按钮列表
2015/03/12 Javascript
javascript实现随时变化着的背景颜色
2015/04/02 Javascript
Node.js实现JS文件合并小工具
2016/02/02 Javascript
ES6的新特性概览
2016/03/10 Javascript
jQuery简单实现列表隐藏和显示效果示例
2016/09/12 Javascript
微信小程序 教程之wxapp视图容器 swiper
2016/10/19 Javascript
js获取隐藏元素的宽高
2017/02/24 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
2017/03/30 Javascript
node.js中路由,中间件,ge请求和post请求的参数详解
2017/12/26 Javascript
JS实现选项卡效果的代码实例
2019/05/20 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
[02:17]《辉夜杯》TRG战队巡礼
2015/10/26 DOTA
python循环监控远程端口的方法
2015/03/14 Python
Python中Threading用法详解
2017/12/27 Python
Python动态生成多维数组的方法示例
2018/08/09 Python
python中栈的原理及实现方法示例
2019/11/27 Python
通过Python扫描代码关键字并进行预警的实现方法
2020/05/24 Python
Python趣味入门教程之循环语句while
2020/08/26 Python
python实现计算器简易版
2020/12/17 Python
Python机器学习工具scikit-learn的使用笔记
2021/01/28 Python
html5手机键盘弹出收起的处理
2020/01/20 HTML / CSS
英国山地公路自行车商店:Tweeks Cycles
2018/03/16 全球购物
湖南卫视在线视频媒体平台:芒果TV
2019/10/30 全球购物
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
yy生日主持词
2014/03/20 职场文书
2014年节能降耗工作总结
2014/12/11 职场文书
节约用电倡议书
2015/04/28 职场文书
解决MySQL Varchar 类型尾部空格的问题
2022/04/06 MySQL
苹果可能正在打击不进行更新的 App
2022/04/24 数码科技