如何使用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 相关文章推荐
多重?l件?合查?(一)
Oct 09 PHP
PHP实现多服务器session共享之NFS共享的方法
Mar 16 PHP
探讨:array2xml和xml2array以及xml与array的互相转化
Jun 24 PHP
php异步多线程swoole用法实例
Nov 14 PHP
php实现的mongodb操作类实例
Apr 03 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
Apr 17 PHP
PHP常见数组函数用法小结
Mar 21 PHP
ThinkPHP表单令牌错误的相关解决方法分析
May 20 PHP
php模拟post上传图片实现代码
Jun 24 PHP
php 解决substr()截取中文字符乱码问题
Jul 18 PHP
Laravel 5.3 学习笔记之 配置
Aug 28 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
Oct 16 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+SqlServer实现分页显示
2006/10/09 PHP
基于mysql的论坛(6)
2006/10/09 PHP
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
ThinkPHP中使用ajax接收json数据的方法
2014/12/18 PHP
php 生成Tab键或逗号分隔的CSV
2016/09/24 PHP
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
javascript制作网页图片上实现下雨效果
2015/02/26 Javascript
详解Angular开发中的登陆与身份验证
2016/07/27 Javascript
AngularJS 依赖注入详解和简单实例
2016/07/28 Javascript
js实现简单的获取验证码按钮效果
2017/03/03 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
2017/07/24 Javascript
jQuery实现点击DIV同时点击CheckBox,并为DIV上背景色的实例
2017/12/18 jQuery
react-native-video实现视频全屏播放的方法
2018/03/19 Javascript
webpack热模块替换(HMR)/热更新的方法
2018/04/05 Javascript
vue 解决循环引用组件报错的问题
2018/09/06 Javascript
layui-laydate时间日历控件使用方法详解
2018/11/15 Javascript
React事件处理的机制及原理
2018/12/03 Javascript
vue组件间通信六种方式(总结篇)
2019/05/15 Javascript
解决$store.getters调用不执行的问题
2019/11/08 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
详解Vue之事件处理
2020/07/10 Javascript
vue中组件通信详解(父子组件, 爷孙组件, 兄弟组件)
2020/07/27 Javascript
超详细小程序定位地图模块全系列开发教学
2020/11/24 Javascript
Python获取网页上图片下载地址的方法
2015/03/11 Python
Python使用flask框架操作sqlite3的两种方式
2018/01/31 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
2018/10/29 Python
python爬虫基础知识点整理
2020/06/02 Python
前台文员个人求职信范文
2014/01/05 职场文书
自荐书4要点
2014/01/25 职场文书
小学班干部竞选演讲稿
2014/04/24 职场文书
医药销售自荐书
2014/05/29 职场文书
安全检查汇报材料
2014/12/26 职场文书
旷课检讨书
2015/01/26 职场文书
慰问信格式
2015/02/14 职场文书
新年晚会开场白
2015/05/29 职场文书
python实现进度条的多种实现
2021/04/29 Python