我看到php有月加法和减法的奇怪问题。
我的问题是:
举几个例子:
echo date('Y-m-d',strtotime('2011-03-31 -1 months')); //2011-03-03
echo date('Y-m-d',strtotime('2011-03-30 -1 months')); //2011-03-02
echo date('Y-m-d',strtotime('2011-03-29 -1 months')); //2011-03-01
echo date('Y-m-d',strtotime('2011-03-28 -1 months')); //2011-02-28
答案 0 :(得分:9)
从您的示例中看,它似乎从月份部分减去1,然后更正非法日期。你的第二个例子:
2011-03-30 - 1 month = 2011-02-30
。这个日期不存在,因为2011年2月只有28天。 30 - 28 = 2
,因此它将其作为下个月的第二天。
但是,我还没有找到关于此的文档。
无论哪种方式,假设我是对的,你的问题的答案是没有,“1个月”没有(天数)等于(常数)等价物,这取决于输入。
答案 1 :(得分:3)
The way strtotime
parses date information在这里非常有价值。
你想要的想要的是上个月的第一天,对吗?
好吧,你可以链接许多这些相关命令。例如,来自PHP交互式shell:
php > $d = date_create('2011-03-28 first day -1 month'); if($d) echo $d->format('Y-m-d H:i:s'); else echo "Failed.";
2011-02-01 00:00:00
php > $d = date_create('2011-03-29 first day -1 month'); if($d) echo $d->format('Y-m-d H:i:s'); else echo "Failed.";
2011-02-01 00:00:00
php > $d = date_create('2011-03-30 first day -1 month'); if($d) echo $d->format('Y-m-d H:i:s'); else echo "Failed.";
2011-02-01 00:00:00
php > $d = date_create('2011-03-31 first day -1 month'); if($d) echo $d->format('Y-m-d H:i:s'); else echo "Failed.";
2011-02-01 00:00:00
php > $d = date_create('2011-04-01 first day -1 month'); if($d) echo $d->format('Y-m-d H:i:s'); else echo "Failed.";
2011-03-01 00:00:00
first day
询问当月的第一天。要求-1 month
在同一天发送到上个月。因为我们已经回到了本月的第一天,所以这将始终按预期工作。