如何使用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实现Socket服务器的代码
Apr 03 PHP
使用eAccelerator加密PHP程序
Oct 03 PHP
PHP 函数语法介绍一
Jun 14 PHP
实用PHP会员权限控制实现原理分析
May 29 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
Jul 08 PHP
PHP实现一维数组转二维数组的方法
Feb 25 PHP
php中的常用魔术方法汇总
Feb 14 PHP
Yii实现文章列表置顶功能示例
Oct 18 PHP
PHP批量删除jQuery操作
Jul 23 PHP
php使用 readfile() 函数设置文件大小大小的方法
Aug 11 PHP
PHP实现验证码校验功能
Nov 16 PHP
Laravel框架文件上传功能实现方法示例
Apr 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
神族 Protoss 剧情介绍
2020/03/14 星际争霸
一段php加密解密的代码
2007/07/16 PHP
PHP n个不重复的随机数生成代码
2009/06/23 PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
盘点PHP和ASP.NET的10大对比!
2015/12/24 PHP
CodeIgniter针对数据库的连接、配置及使用方法
2016/03/03 PHP
关于ThinkPHP中的异常处理详解
2018/05/11 PHP
php依赖注入知识点详解
2019/09/23 PHP
JObj预览一个JS的框架
2008/03/13 Javascript
js 输出内容到新窗口具体实现代码
2013/05/31 Javascript
jquery 简单应用示例总结
2013/08/09 Javascript
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
JQuery select(下拉框)操作方法汇总
2015/04/15 Javascript
javascript生成大小写字母
2015/07/03 Javascript
浅谈jQuery添加的HTML,JS失效的问题
2016/10/05 Javascript
JavaScript中最常见的三个面试题解析
2017/03/04 Javascript
Three.js利用dat.GUI如何简化试验流程详解
2017/09/26 Javascript
angularJs中$http获取后台数据的实例讲解
2018/08/08 Javascript
解决angularjs WdatePicker ng-model的问题
2018/09/13 Javascript
一百行JS代码实现一个校验工具
2019/04/30 Javascript
Vue 解决多级动态面包屑导航的问题
2019/11/04 Javascript
JavaScript实现前端倒计时效果
2021/02/09 Javascript
[40:29]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第一场
2018/04/10 DOTA
Python使用OpenCV进行标定
2018/05/08 Python
python3实现爬取淘宝美食代码分享
2018/09/23 Python
Python使用dict.fromkeys()快速生成一个字典示例
2019/04/24 Python
解决Django layui {{}}冲突的问题
2019/08/29 Python
python、PyTorch图像读取与numpy转换实例
2020/01/13 Python
Python3.7黑帽编程之病毒篇(基础篇)
2020/02/04 Python
将python文件打包exe独立运行程序方法详解
2020/02/12 Python
Farnell德国:电子元器件供应商
2018/07/10 全球购物
致800米运动员广播稿
2014/02/16 职场文书
2014年冬季防火方案
2014/05/21 职场文书
清明节演讲稿
2014/05/27 职场文书
党员违纪检讨书
2015/05/05 职场文书
行政申诉状范文
2015/05/20 职场文书