转自:http://www.phppan.com/2011/06/php-last-month-today/

一日,遇到一个问题,求上一个月的今天。 最开始我们使用 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” 则在跨年的时间上有问题。 这点还是在写这篇文章时发现的。

除了这种方法,还可以先算出年月日再拼接字符串,这里就是纯粹的字符串操作了。

感触:

  • 一个月不写代码,会手生。
  • 代码写完后请多次review或重构,即使比较简单的代码。

转载于:https://www.cnblogs.com/fzzl/archive/2013/01/06/2848035.html

【转】使用PHP计算上一个月的今天相关推荐

  1. php 计算上个月,如何使用PHP计算上一个月的今天

    一日,遇到一个问题,求上一个月的今天. 最开始我们使用 strtotime("-1 month") 函数求值,发现有一个问题,月长度不一样的月份的计算结果有误. 比如:2011-0 ...

  2. 简单快捷计算本月第一天星期几、本月有多少天、上一个月的最后一天是几号

    今天偶然在vue2/nodejs视频中看到一个计算"本月第一天星期几.本月有多少天.上一个月的最后一天是几号" 最简便最快捷的方法. 如果自己写,就很容易要判断闰年问题,那就非常复 ...

  3. 查询一个表中一个字段相同的数据_最实用MySQL 查询当天、本周,本月、上一个月的数据...

    MySQL 查询当天.本周,本月.上一个月的数据 mysql查询当天的所有信息: SELECT * FROM 表名 WHERE year(时间字段名)=year(now()) and month(时间 ...

  4. 根据指定日期获取上一个月

    根据指定日期获取上一个月 看过不少类似文章,根据一个日期,要取得相应的上一个月的值,则利用Calendar的api:get(Calendar.MONTH) - 1)来算. 思路是对的,但这个api有坑 ...

  5. php 上一个月的开始和结束,php获取上一个月的开始与结束时间遇到的问题

    改正之前: $_lastMonthStart = date('Y-m-1 00:00:00', strtotime("-1 month")); $_lastMonthEnd = d ...

  6. Android开发之Java和Calendar日期上一年,上一个月,前一天,前一周的方法

    公司做的项目要求选择日期可以选择上一个月的,很简单,但是涉及到临界日期,例如跨年 直接的问题从2019.1.1往前一个月那就不简单了,于是找到相关方法自己尝试下.理解出了两个往前一年的区别 看下图: ...

  7. js获取上一个月、下一个月

    /*** 获取上一个月** @date 格式为yyyy-mm-dd的日期,如:2014-01-25*/function getPreMonth(date) {var arr = date.split( ...

  8. 获取当前日期的上一个月和后三个月。

    import datetime from dateutil.relativedelta import relativedelta #获取当前日期的上一个月和后一个月 print(datetime.da ...

  9. Calendar类获取当前时间上一个月,下一个月,当月的最后一天等的处理方法

    Calendar cal = Calendar.getInstance();//获取一个Calendar对象 cal.setTime(new Date() ); cal.add(Calendar.MO ...

最新文章

  1. 第九章 大网高级   ASA 高级设置
  2. navicat for mysql 怎么连接远程数据库服务器
  3. 给python初学者的最好练手项目-Python的练手项目有哪些值得推荐?(知乎转载)...
  4. macOS Big Sur Wi-Fi 网络无法连接如何解决
  5. ios开发ocr识别_传统图像处理技术,ocr识别技术算法
  6. 因非法扣押物资 华为向伟创力发律师函索赔数亿元
  7. 实物贴图风格拟物图标素材,高逼格即显
  8. RabbitMQ WEB管理端
  9. 【车牌识别】基于matlab形态学车牌识别【含Matlab源码 1155期】
  10. Autodesk 3DSMax 2014 安装注册说明
  11. SSIS ODBC方式连接mysql数据库、oracle数据库
  12. C语言 梯形面积
  13. 西部数据移动硬盘哪个型号好_西数移动硬盘哪个系列好?西部数据Blue系列3D进阶高速蓝盘怎么样,质量好吗?...
  14. 【.Net码农】ListT 类
  15. 基于sammy的前端mvc框架
  16. 在线编辑、在线预览、在线转换,基于wps.js + java + react / vue,无需任何插件,零安装
  17. 计算机修改人类记忆曲线,艾宾浩斯遗忘曲线和费曼技巧
  18. 《历》·陕西帝王陵寝一览
  19. 修改elementUI的el-popconfirm 气泡确认框样式不起效果
  20. 大学物理实验报告2——数字示波器的使用

热门文章

  1. python错误代码40035_Python 创建XML
  2. RabbitMQ 消息确认机制 以及 原理解析
  3. 004_Vue按键修饰符
  4. 009_字符串内建函数
  5. 061_html字符实体
  6. cnn stride and padding_CNN中的stride、kernel、padding计算
  7. 集合框架源码分析三(实现类篇ArrayList,LinkedList,HashMap)
  8. Android数据库高手秘籍
  9. 机器学习视觉图像算法工程师--面试笔试--常考知识点乱找总结
  10. mysql函数数组参数_MYSQL数组聚合函数,如PostgreSQL array_agg