如何使用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 中文字符入库或显示乱码问题的解决方法
Apr 12 PHP
JS 网站性能优化笔记
May 24 PHP
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
May 07 PHP
PHP无限分类(树形类)的深入分析
Jun 02 PHP
解析Extjs与php数据交互(增删查改)
Jun 25 PHP
Thinkphp多文件上传实现方法
Oct 31 PHP
使用PHP生成PDF方法详解
Jan 23 PHP
PHP删除指定目录中的所有目录及文件的方法
Feb 26 PHP
php实现过滤字符串中的中文和数字实例
Jul 29 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
Jun 07 PHP
Yii2框架实现登录、退出及自动登录功能的方法详解
Oct 24 PHP
PHP实现随机发扑克牌
Apr 22 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
收音机史话 - 1960年代前后的DIY
2021/03/02 无线电
默默简单的写了一个模板引擎
2007/01/02 PHP
PHP简单处理表单输入的特殊字符的方法
2016/02/03 PHP
Yii框架参数配置文件params用法实例分析
2019/09/11 PHP
20个非常有用的PHP类库 加速php开发
2010/01/15 Javascript
工作需要写的一个js拖拽组件
2011/07/28 Javascript
修改file按钮的默认样式实现代码
2013/04/23 Javascript
图片上传判断及预览脚本的效果实例
2013/08/07 Javascript
实例详解Nodejs 保存 payload 发送过来的文件
2016/01/14 NodeJs
简单实现的JQuery文本框水印插件
2016/06/14 Javascript
vue如何实现observer和watcher源码解析
2017/03/09 Javascript
BootStrap 表单控件之单选按钮水平排列
2017/05/23 Javascript
详解EasyUi控件中的Datagrid
2017/08/23 Javascript
Vue 组件间的样式冲突污染
2017/08/31 Javascript
Vue props 单向数据流的实现
2018/11/06 Javascript
了解Javascript中函数作为对象的魅力
2019/06/19 Javascript
JS出现404错误原理及解决方案
2020/07/01 Javascript
[01:04:06]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第一局
2016/02/26 DOTA
Python自动连接ssh的方法
2015/03/07 Python
探究Python的Tornado框架对子域名和泛域名的支持
2015/05/02 Python
python操作ssh实现服务器日志下载的方法
2015/06/03 Python
python列出目录下指定文件与子目录的方法
2015/07/03 Python
Python 字典与字符串的互转实例
2017/01/13 Python
Python中%是什么意思?python中百分号如何使用?
2018/03/20 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
2018/05/18 Python
python判断设备是否联网的方法
2018/06/29 Python
python使用梯度下降算法实现一个多线性回归
2020/03/24 Python
澳大利亚领先的在线葡萄酒零售商:Get Wines Direct
2018/03/27 全球购物
学校司机岗位职责
2013/11/14 职场文书
留守儿童工作方案
2014/06/02 职场文书
企业标语口号
2014/06/10 职场文书
生产车间标语
2014/06/11 职场文书
庆六一文艺汇演活动方案
2014/08/26 职场文书
党的群众路线教育实践活动学习笔记范文
2014/11/06 职场文书
2014年个人技术工作总结
2014/12/08 职场文书
2015年学校远程教育工作总结
2015/07/20 职场文书