一日,遇到一个问题,求上一个月的今天。 最开始我们使用 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或重构,即使比较简单的代码。
  用此方法date(“Y-m-d”, strtotime(“-1 month”))得到上个月的日期时是有问题存在的。问题就出在当前月如果有30,31号时用此方法获取上月会出错。比如你在1月30号或1月31号时用此方法得到上月的月份会显示还是1月份。因此,采用这个函数自动获取上个月的记录则出错。还是笨办法解决:

if (date("n") == 1) {

  $tmpMonth = 12;

  $tmpYear = date ("Y") - 1;

}else{

  $tmpMonth = date ("n") - 1;

  $tmpYear = date ("Y");

}

$tmpDate = "$tmpYear-$tmpMonth-1";

使用PHP计算上一个月的今天的更多相关文章

  1. PHP计算上一个月最后一天、当月最后一天、下一个月最后一天

    上个月最后一天: $last_month_last_day = date('Y-m-t',strtotime('-1 month')); 当月最后一天: $first_day=date('Y-m-01 ...

  2. js计算当前日期上一个月和下一个月

    /**         * 获取上一个月         *         * @date 格式为yyyy-mm-dd的日期,如:2014-01-25         */        funct ...

  3. js获取上一个月、下一个月格式为yyyy-mm-dd的日期

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

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

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

  5. python获取上一个月第一天0点的unix时间戳

    这两天做统计,需要用到当月第一天0点0分0秒的unix timestamp,上个月第一天0点的unix时间戳,三个月前月第一天的0点的Unix时间戳,六个月前当月第一天的0点的Unix时间戳,现在整理 ...

  6. JS 如何获取当前上一个月、下一个月和月份所含天数

    在数据报表查询中,经常需要设置查询的日期区间,如查询2018-02-01至2018-02-28的整月数据,这时需要提供快捷整月查询按钮: 如: 一般日期年月日之间由"-"或者&qu ...

  7. mysql 查询当天、本周,本月,上一个月的数据---https://www.cnblogs.com/benefitworld/p/5832897.html

    mysql 查询当天.本周,本月,上一个月的数据 今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM ...

  8. JS中在当前日期上追加一天或者获取上一个月和下一个月

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

  9. php时间:获取上一个月,本月天数,下一个月

    时间戳转日期 date() 日期转时间戳 strtotime() 当前时间戳time() 获取当前月的天数: $i=; $y=; echo date("t",strtotime(& ...

随机推荐

  1. oracle PL/SQL(procedure language/SQL)程序设计之函数+过程+包

    匿名PL/SQL块回顾 DECLARE (可选)    定义在PL/SQL块中要使用的对象BEGIN (必须)    执行语句EXCEPTION (可选)    错误处理语句END; (必须)匿名块( ...

  2. hdu 4099 Revenge of Fibonacci 大数+压位+trie

    最近手感有点差,所以做点水题来锻炼一下信心. 下周的南京区域赛估计就是我的退役赛了,bless all. Revenge of Fibonacci Time Limit: 10000/5000 MS ...

  3. Android apk 的安装过程

    Android应用安装有如下四种方式 1.系统应用安装――开机时完成,没有安装界面 2.网络下载应用安装――通过market应用完成,没有安装界面 3.ADB工具安装――没有安装界面. 4.第三方应用 ...

  4. html5 requestAnimationFrame制作动画:旋转风车

    详细内容请点击 在以往,我们在网页上制作动画效果的时候,如果是用javascript实现,一般都是通过定时器和间隔来实现的,出现HTML5之后,我们还可以用CSS3 的transitions和anim ...

  5. 第三回 Bootstrap3.x 起步

    基本模版 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="u ...

  6. DIV+CSS解决IE6,IE7,IE8,FF兼容问题

    1.IE8下兼容问题,这个最好处理,转化成IE7兼容就可以.在头部加如下一段代码,然后只要在IE7下兼容了,IE8下面也就兼容了:1. <metahttp-equivmetahttp-equiv ...

  7. 使用T4为数据库自动生成实体类

    T4 (Text Template Transformation Toolkit) 是一个基于模板的代码生成器.使用T4你可以通过写一些ASP.NET-like模板,来生成C#, T-SQL, XML ...

  8. MarkFan的程序员客栈

    历史上的今天:2013-12-27 跨平台移动开发 App-Framework DEMO 演示

  9. Python类和实例

    面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可 ...

  10. SQL Server高级内容之子查询和表链接

    1.子查询概念 (1)就是在查询的where子句中的判断依据是另一个查询的结果,如此就构成了一个外部的查询和一个内部的查询,这个内部的查询就是自查询. (2)自查询的分类 1)独立子查询 ->独 ...