如何使用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 相关文章推荐
基于mysql的bbs设计(二)
Oct 09 PHP
php中日期加减法运算实现代码
Dec 08 PHP
实用的简单PHP分页集合包括使用方法
Oct 21 PHP
php 检查电子邮件函数(自写)
Jan 16 PHP
php教程之魔术方法的使用示例(php魔术函数)
Feb 12 PHP
PHP函数eval()介绍和使用示例
Aug 20 PHP
PHP+Mysql实现多关键字与多字段生成SQL语句的函数
Nov 05 PHP
php查看网页源代码的方法
Mar 13 PHP
CodeIgniter配置之database.php用法实例分析
Jan 20 PHP
Netbeans 8.2将支持PHP7 更精彩
Jun 13 PHP
thinkphp中的多表关联查询的实例详解
Oct 12 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
Feb 27 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
乱谈我对耳机、音箱的感受
2021/03/02 无线电
php基础知识:控制结构
2006/12/13 PHP
开源SNS系统-ThinkSNS
2008/05/18 PHP
php实现在线生成条形码示例分享(条形码生成器)
2013/12/30 PHP
php+mysql结合Ajax实现点赞功能完整实例
2015/01/30 PHP
利用PHP绘图函数实现简单验证码功能的方法
2016/10/18 PHP
PHP性能测试工具xhprof安装与使用方法详解
2018/04/29 PHP
鼠标事件延时切换插件
2011/03/12 Javascript
关于jquery ajax 调用带参数的webservice返回XML数据一个小细节
2012/07/31 Javascript
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
在新窗口打开超链接的方法小结
2013/04/14 Javascript
常见JS验证脚本汇总
2015/12/01 Javascript
Javascript随机标签云代码实例
2016/06/21 Javascript
JavaScript实现简单的日历效果
2016/09/25 Javascript
js实现表单提交后不重新刷新当前页面
2016/11/30 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
基于rem的移动端响应式适配方案(详解)
2017/07/07 Javascript
Vue+jquery实现表格指定列的文字收缩的示例代码
2018/01/09 jQuery
JS运动特效之链式运动分析
2018/01/24 Javascript
js实现左右两侧浮动广告
2018/07/09 Javascript
使用ECharts实现状态区间图
2018/10/25 Javascript
Node.js+Express+Mysql 实现增删改查
2019/04/03 Javascript
常见的浏览器存储方式(cookie、localStorage、sessionStorage)
2019/05/07 Javascript
nodejs使用socket5进行代理请求的实现
2020/02/21 NodeJs
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
Django --Xadmin 判断登录者身份实例
2020/07/03 Python
css3 border-radius属性详解
2017/07/05 HTML / CSS
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
顺丰快递Java软件工程师面试题
2015/07/31 面试题
会计应届生的自荐信
2013/12/13 职场文书
银行员工职业规划范文
2014/01/21 职场文书
立志成才演讲稿
2014/09/04 职场文书
法院干警四风问题个人对照检查材料思想汇报
2014/10/07 职场文书
先进单位申报材料
2014/12/25 职场文书
2016年五一促销广告语
2016/01/28 职场文书
各国货币符号大全
2022/02/17 杂记