如何使用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 相关文章推荐
ADODB的数据库封包程序库
Dec 31 PHP
php 表单验证实现代码
Mar 10 PHP
php中全局变量global的使用演示代码
May 18 PHP
PHP中source #N问题的解决方法
Jan 27 PHP
基于PHP的简单采集数据入库程序
Jul 30 PHP
php搜索文件程序分享
Oct 30 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
Nov 24 PHP
修改PHP脚本使WordPress拦截垃圾评论的方法示例
Dec 10 PHP
使用phpstorm和xdebug实现远程调试的方法
Dec 29 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
Feb 10 PHP
php实现微信扫码支付
Mar 26 PHP
PHP经典实用正则表达式小结
May 04 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/03 咖啡文化
php中使用cookie来保存用户登录信息的实现代码
2012/03/08 PHP
关于PHP的相似度计算函数:levenshtein的使用介绍
2013/04/15 PHP
php将gd生成的图片缓存到memcache的小例子
2013/06/05 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
2020/09/17 PHP
一些有关检查数据的JS代码
2006/09/07 Javascript
关于JavaScript的gzip静态压缩方法
2007/01/05 Javascript
js 深拷贝函数
2008/12/04 Javascript
一个XML格式数据转换为图表的例子
2010/02/09 Javascript
javascript打印大全(打印页面设置/打印预览代码)
2013/03/29 Javascript
jquery插件validate验证的小例子
2013/05/08 Javascript
Flexigrid在IE下不显示数据的有效处理方法
2014/09/04 Javascript
jQuery获取标签文本内容和html内容的方法
2015/03/27 Javascript
window.location.reload 刷新使用分析(去对话框)
2015/11/11 Javascript
angularjs自定义ng-model标签的属性
2016/01/21 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
laydate 显示结束时间不小于开始时间的实例
2017/08/11 Javascript
Node实战之不同环境下配置文件使用教程
2018/01/02 Javascript
Vue.directive 自定义指令的问题小结
2018/03/04 Javascript
vuejs实现ready函数加载完之后执行某个函数的方法
2018/08/31 Javascript
vue 使用高德地图vue-amap组件过程解析
2019/09/07 Javascript
微信小程序转化为uni-app项目的方法示例
2020/05/22 Javascript
Vue-router编程式导航的两种实现代码
2021/03/04 Vue.js
[50:58]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 Mineski vs EG
2018/04/03 DOTA
跟老齐学Python之模块的加载
2014/10/24 Python
Python读取excel中的图片完美解决方法
2018/07/27 Python
python安装twisted的问题解析
2018/08/21 Python
python基于exchange函数发送邮件过程详解
2020/11/06 Python
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
区域总监的岗位职责
2013/11/21 职场文书
毕业生就业自荐信
2013/12/04 职场文书
学习全国两会精神心得体会范文
2014/03/17 职场文书
婚纱店策划方案
2014/05/22 职场文书
自主招生推荐信格式模板
2015/03/24 职场文书
网络研修心得体会
2016/01/08 职场文书
redis客户端实现高可用读写分离的方式详解
2021/07/04 Redis