2020年3月

php strtotime相对时间-1month的使用问题

历史代码的一个问题

➜  ~ date
Tue Mar 31 17:37:20 CST 2020
➜  ~ php -r "echo date('Y-m', strtotime('-1 month'));"
2020-03                                                                                                                                                                                                        
➜  ~ php -r "echo date('Y-m', strtotime('+1 month'));"
2020-05

当前日期是2020年03月31日,直观感觉减一个月应该是输出2020-02,加一个月应该是输出2020-04。

➜  ~ cal 2 2020
   February 2020
Su Mo Tu We Th Fr Sa
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29

➜  ~ cal 3 2020
     March 2020
Su Mo Tu We Th Fr Sa
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31


➜  ~ cal 4 2020
     April 2020
Su Mo Tu We Th Fr Sa
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

其实是程序跟人理解不同造成的:
2020年03月31日,减一个月等于 2020年02月31日,系统没有2020年02月31日,往前加就等于2020年03月02日
2020年03月31日,加一个月等于 2020年04月31日,系统没有2020年04月31日,往前加就等于2020年05月01日

#php5.3之前可以采用:

➜  ~ php -r "echo date('Y-m-d', strtotime(date('Ym01').' -1 month'));"
2020-02-01  

     

#php5.3之后可以采用:

    ➜  ~ php -r "echo date('Y-m-d', strtotime('first day of -1 month'));"
2020-02-01                                                                                                                                                                                               ➜  ~ php -r "echo date('Y-m-d', strtotime('last day of -1 month'));"
2020-02-29