基本写法产生的差异

for($i=1;$i<150;$i++){$date = date('Y-m-d',strtotime("+{$i} day",strtotime('2022-01-25')));echo $date.' >>> ';
//    echo getNaturalMonth(-1,$date,true);echo date('Y-m-d',strtotime('+1 month',strtotime($date)));echo PHP_EOL;
}

优化写法:

/*** 获取某个时间的下一个自然月日期* @date 2022/5/31* @param int $num 增加月数 1增加一个月 -1减少一个月* @param null $date 日期* @param bool $is_supplement 如果是当前时间是本月最后一天则获取的新的自然月自动返回最后一天日期* @return false|string|null*/
function getNaturalMonth($num = 1,$date=null,$is_supplement = false)
{$new_date = null;$time = isset($date) ? strtotime($date): time();$_time = strtotime($num.' month',$time);$new_date = date('Y-m-d',$_time);$new_day = date('d',$_time);if($is_supplement == true && $new_day == date('t',$time)) { //当前日期是最后一天$new_date = date('Y-m-t', strtotime('last day of ' . $num . ' month', $time));} elseif($new_day != date('d',$time)){ //判断获取的月份天是不是与当前日期天相同$new_date = date('Y-m-d',strtotime('last day of '.$num.' month',$time));}return $new_date;
}

当$is_supplement = false时

2022-01-26 >>> 2022-02-26
2022-01-27 >>> 2022-02-27
2022-01-28 >>> 2022-02-28
2022-01-29 >>> 2022-02-28
2022-01-30 >>> 2022-02-28
2022-01-31 >>> 2022-02-28
2022-02-01 >>> 2022-03-01
2022-02-02 >>> 2022-03-02
2022-02-03 >>> 2022-03-03
2022-02-04 >>> 2022-03-04
2022-02-05 >>> 2022-03-05
2022-02-06 >>> 2022-03-06
2022-02-07 >>> 2022-03-07
2022-02-08 >>> 2022-03-08
2022-02-09 >>> 2022-03-09
2022-02-10 >>> 2022-03-10
2022-02-11 >>> 2022-03-11
2022-02-12 >>> 2022-03-12
2022-02-13 >>> 2022-03-13
2022-02-14 >>> 2022-03-14
2022-02-15 >>> 2022-03-15
2022-02-16 >>> 2022-03-16
2022-02-17 >>> 2022-03-17
2022-02-18 >>> 2022-03-18
2022-02-19 >>> 2022-03-19
2022-02-20 >>> 2022-03-20
2022-02-21 >>> 2022-03-21
2022-02-22 >>> 2022-03-22
2022-02-23 >>> 2022-03-23
2022-02-24 >>> 2022-03-24
2022-02-25 >>> 2022-03-25
2022-02-26 >>> 2022-03-26
2022-02-27 >>> 2022-03-27
2022-02-28 >>> 2022-03-28
2022-03-01 >>> 2022-04-01
2022-03-02 >>> 2022-04-02
2022-03-03 >>> 2022-04-03
2022-03-04 >>> 2022-04-04
2022-03-05 >>> 2022-04-05
2022-03-06 >>> 2022-04-06
2022-03-07 >>> 2022-04-07
2022-03-08 >>> 2022-04-08
2022-03-09 >>> 2022-04-09
2022-03-10 >>> 2022-04-10
2022-03-11 >>> 2022-04-11
2022-03-12 >>> 2022-04-12
2022-03-13 >>> 2022-04-13
2022-03-14 >>> 2022-04-14
2022-03-15 >>> 2022-04-15
2022-03-16 >>> 2022-04-16
2022-03-17 >>> 2022-04-17
2022-03-18 >>> 2022-04-18
2022-03-19 >>> 2022-04-19
2022-03-20 >>> 2022-04-20
2022-03-21 >>> 2022-04-21
2022-03-22 >>> 2022-04-22
2022-03-23 >>> 2022-04-23
2022-03-24 >>> 2022-04-24
2022-03-25 >>> 2022-04-25
2022-03-26 >>> 2022-04-26
2022-03-27 >>> 2022-04-27
2022-03-28 >>> 2022-04-28
2022-03-29 >>> 2022-04-29
2022-03-30 >>> 2022-04-30
2022-03-31 >>> 2022-04-30
2022-04-01 >>> 2022-05-01
2022-04-02 >>> 2022-05-02
2022-04-03 >>> 2022-05-03
2022-04-04 >>> 2022-05-04
2022-04-05 >>> 2022-05-05
2022-04-06 >>> 2022-05-06
2022-04-07 >>> 2022-05-07
2022-04-08 >>> 2022-05-08
2022-04-09 >>> 2022-05-09
2022-04-10 >>> 2022-05-10
2022-04-11 >>> 2022-05-11
2022-04-12 >>> 2022-05-12
2022-04-13 >>> 2022-05-13
2022-04-14 >>> 2022-05-14
2022-04-15 >>> 2022-05-15
2022-04-16 >>> 2022-05-16
2022-04-17 >>> 2022-05-17
2022-04-18 >>> 2022-05-18
2022-04-19 >>> 2022-05-19
2022-04-20 >>> 2022-05-20
2022-04-21 >>> 2022-05-21
2022-04-22 >>> 2022-05-22
2022-04-23 >>> 2022-05-23
2022-04-24 >>> 2022-05-24
2022-04-25 >>> 2022-05-25
2022-04-26 >>> 2022-05-26
2022-04-27 >>> 2022-05-27
2022-04-28 >>> 2022-05-28
2022-04-29 >>> 2022-05-29
2022-04-30 >>> 2022-05-30
2022-05-01 >>> 2022-06-01

当$is_supplement =true时

2022-01-26 >>> 2022-02-26
2022-01-27 >>> 2022-02-27
2022-01-28 >>> 2022-02-28
2022-01-29 >>> 2022-02-28
2022-01-30 >>> 2022-02-28
2022-01-31 >>> 2022-02-28
2022-02-01 >>> 2022-03-01
2022-02-02 >>> 2022-03-02
2022-02-03 >>> 2022-03-03
2022-02-04 >>> 2022-03-04
2022-02-05 >>> 2022-03-05
2022-02-06 >>> 2022-03-06
2022-02-07 >>> 2022-03-07
2022-02-08 >>> 2022-03-08
2022-02-09 >>> 2022-03-09
2022-02-10 >>> 2022-03-10
2022-02-11 >>> 2022-03-11
2022-02-12 >>> 2022-03-12
2022-02-13 >>> 2022-03-13
2022-02-14 >>> 2022-03-14
2022-02-15 >>> 2022-03-15
2022-02-16 >>> 2022-03-16
2022-02-17 >>> 2022-03-17
2022-02-18 >>> 2022-03-18
2022-02-19 >>> 2022-03-19
2022-02-20 >>> 2022-03-20
2022-02-21 >>> 2022-03-21
2022-02-22 >>> 2022-03-22
2022-02-23 >>> 2022-03-23
2022-02-24 >>> 2022-03-24
2022-02-25 >>> 2022-03-25
2022-02-26 >>> 2022-03-26
2022-02-27 >>> 2022-03-27
2022-02-28 >>> 2022-03-31
2022-03-01 >>> 2022-04-01
2022-03-02 >>> 2022-04-02
2022-03-03 >>> 2022-04-03
2022-03-04 >>> 2022-04-04
2022-03-05 >>> 2022-04-05
2022-03-06 >>> 2022-04-06
2022-03-07 >>> 2022-04-07
2022-03-08 >>> 2022-04-08
2022-03-09 >>> 2022-04-09
2022-03-10 >>> 2022-04-10
2022-03-11 >>> 2022-04-11
2022-03-12 >>> 2022-04-12
2022-03-13 >>> 2022-04-13
2022-03-14 >>> 2022-04-14
2022-03-15 >>> 2022-04-15
2022-03-16 >>> 2022-04-16
2022-03-17 >>> 2022-04-17
2022-03-18 >>> 2022-04-18
2022-03-19 >>> 2022-04-19
2022-03-20 >>> 2022-04-20
2022-03-21 >>> 2022-04-21
2022-03-22 >>> 2022-04-22
2022-03-23 >>> 2022-04-23
2022-03-24 >>> 2022-04-24
2022-03-25 >>> 2022-04-25
2022-03-26 >>> 2022-04-26
2022-03-27 >>> 2022-04-27
2022-03-28 >>> 2022-04-28
2022-03-29 >>> 2022-04-29
2022-03-30 >>> 2022-04-30
2022-03-31 >>> 2022-04-30
2022-04-01 >>> 2022-05-01
2022-04-02 >>> 2022-05-02

PHP strtotime 获取自然月误差问题解决方案相关推荐

  1. strtotime 获取一个月的开始 或者一个月的结束

    //1.strtotime 获取一个月的开始 或者一个月的结束 $firstday = date('Ym01', strtotime($date));     $lastday = date('Ymd ...

  2. js moment.js 给定时间 获取自然月、周的时间轴

    1.需求 要实现这个时间轴的自然周.自然月的选择功能,需要思考两个问题 处理给定时间的本周与本月时间的显示,如输入 2021-07-29,最后一个月就是 2021-07-01 - 2021-07-29 ...

  3. 获取自然周 自然月 区间

    public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");/*** @Descri ...

  4. 获取具体日期N个月前(后)的自然月时间戳

    /*** 获取具体日期N个月前(后)的自然月时间戳* * $date 日期(时间戳) 1580400000* $num 前后多少个月,例如:前一个月:-1 :后一个月:1 */ function ge ...

  5. Date-如何获取自然天,自然周,自然月,自然年?

    前言:有次在开发过程中,遇到一个需求.需要获取上count个自然天,自然周,自然月,自然年. 当时第一反应就是有没有工具类可以直接实现这个功能. 经过一番的探索,最终发现了这个工具类:Calendar ...

  6. JS获取上周(自然周、最近七天)、上月(自然月、最近一个月)、全年的开始和结束日期

    JS获取上周(自然周.最近七天).上月(自然月.最近一个月).全年的开始和结束日期 let now = new Date(); let nowTime = now.getTime(); //当前的时间 ...

  7. php 计算月,PHP自然月的算法

    有时候会用到时间戳!获取月排行什么的!需要自然月的算法! 尽管tp5中有时间函数已经很强大了,但是里面没有给出自然月的算法! 下面我就把我写的自然月算法贴出来,尽管不完善,大家拿去后将算法完善下 fu ...

  8. PHP获取自然周始末时间

    之前做了一个项目做抽奖的,里面有个需求,每个用户每个自然周能抽中一次指定产品. 自然周指的是:从周一到周日算作一个自然周. 但是作为PHP中的lower,还是能力捉急,只好百度 还挺多的嘛!想也不想先 ...

  9. 每天的0点php,使用strtotime,这个月的第一天凌晨0点在PHP?(Using just strtotime, 0 am first day of this month in PHP?)...

    使用strtotime,这个月的第一天凌晨0点在PHP?(Using just strtotime, 0 am first day of this month in PHP?) echo mydate ...

最新文章

  1. linux 内核模块 编译错误 include/linux/mmzone.h:18:26: fatal error: linux/bounds.h: No such file or director
  2. sprintf php 数字占位,PHP sprintf()实现格式化输出
  3. 【工作总结】C++ string工具类
  4. SAP云平台,区块链,超级账本和智能合约
  5. 全民熬夜的时代,如何做到早睡?
  6. cocos2dx中的Rapidjson
  7. 软件众包,哪个数据库好
  8. 编码基本功:工作中,大多数人不会举一反三
  9. Cell插件在J2EE系统中的应用
  10. Frank Pfenning
  11. 俄亥俄州立大学计算机专业排名,OSU的Computer Science and Engineering「俄亥俄州立大学计算机科学与工程系」...
  12. ReactNative出现诸如以上的错误; ** is not defined.都是没有导入相应的库.
  13. PTA--基础编程题目集(7-10 计算工资) Python版
  14. 蓝牙路由器解决方案行业应用
  15. 偶感 - 写在细雨朦胧的早晨
  16. 任正非:我们最需要一本厚厚的中国护照
  17. iPhone开发之音视频的播放——MPMoviePlayerViewController和AVAutoPlayer的使用
  18. dd linux 格式化u盘启动盘_Ubuntu使用dd命令制作U盘系统启动盘
  19. React Native快速构建跨平台移动应用程序
  20. 深入剖析Go Web服务器实现原理

热门文章

  1. 用于SAAS公司的MRR模型--对一个公司LTV的预测
  2. javamail,java发email,发邮件,jaf,activation,j2ee5冲突问题解决
  3. 云风开发笔记(1) 背包系统
  4. 计算机毕业设计Java校园绿化管理系统(源码+系统+mysql数据库+Lw文档)
  5. [洛谷P2482][SDOI2010]猪国杀
  6. matlab相关性分析频谱_信号与系统:用matlab分析wav音频的频谱
  7. 多个相机工作可能解决办法
  8. 第九十章 参数关键字 - Flags
  9. 【Vue】实现当前页面刷新的四种方法
  10. Cookie-Parser是如何解析签名后的cookie的(同时对cookie和cookie-signature进行说明)