2012-05-31 2 views
0

Можно создать дубликат:
PHP date() and strtotime() return wrong months on 31stЧто происходит на сегодняшний день PHP функции

У меня есть этот код и выводит что-то странное я думаю. Итак, что я делаю неправильно здесь.

<?php 
$sP1 = date('m Y'); 
$sP2 = date('m Y', strtotime('+01 month')); 
$sP3 = date('m Y', strtotime('+02 month')); 
$sP4 = date('m Y', strtotime('+03 month')); 
echo $sP1.'<br>'; 
echo $sP2.'<br>'; 
echo $sP3.'<br>'; 
echo $sP4.'<br>'; 
?> 

и это выводит

05 2012 
07 2012 
07 2012 
08 2012 

я думаю, что второй один должен быть

06 2012 

Кто-нибудь знает какие-либо решения?

+1

Смотрите принятый ответ на этот вопрос: http://stackoverflow.com/questions/9058523/php-date-and-strtotime-return-wrong -months-on-31st – Andy

+0

Большое спасибо .. :) – Prashank

ответ

2

Сегодня 31-й в следующем месяце имеет только 30 дней, поэтому было бы 7/12 в течение 1 месяца с сегодняшнего дня

assuming that today is May 31 2012 

date('m Y') == 05 2012 
date('m Y', strtotime('+1 month')) == 07 2012 because june has 30 days 
date('m Y', strtotime('+2 month')) == 07 2012 
date('m Y', strtotime('+3 month')) == 08 2012 
date('m Y', strtotime('+4 month')) == 10 2012 

Я бы сегодняшнюю дату и найти первый день месяца, а затем добавить в месяц к этому, если вы делаете то, что нужно получать каждый месяц

1

Он работает по назначению. В двух словах, это потому, что «один месяц» с 31 мая? 30 июня? 1 августа?

Мое предложение состоит в том, что если вам нужны последовательные месяцы, вычислите смещение с начала текущего месяца, а не текущего дня. Или составите дату, которую вы ищете вручную, используя раздельные части месяца, дня и года.

+2

Что вы делали с бедным июлем? :( – Andy

2

Как говорили другие, это потому, что сегодня 31-й и +1 месяц равен 31 июня, который меняется на 1 июля. Если вы включаете день в строку даты, вы можете увидеть именно это.

<?php 
$sP1 = date('m-d-Y'); 
$sP2 = date('m-d-Y', strtotime('+01 month')); 
$sP3 = date('m-d-Y', strtotime('+02 month')); 
$sP4 = date('m-d-Y', strtotime('+03 month')); 
echo $sP1."\n"; 
echo $sP2."\n"; 
echo $sP3."\n"; 
echo $sP4."\n"; 
/* Outputs: 
    05-31-2012 
    07-01-2012 
    07-31-2012 
    08-31-2012 
*/ 
?> 

StrToTime хотя можно взять дату начала как часть строки так, как предложил Кинг, вычислить + N месяцев с первого. Таким образом, строка, как May-1-2012 +01 month, такие как:

<?php 
$sP1 = date('m Y'); 
$sP2 = date('m Y', strtotime(date('M-1-Y').' +01 month')); 
$sP3 = date('m Y', strtotime(date('M-1-Y').' +02 month')); 
$sP4 = date('m Y', strtotime(date('M-1-Y').' +03 month')); 
echo $sP1."\n"; 
echo $sP2."\n"; 
echo $sP3."\n"; 
echo $sP4."\n"; 
/* Outputs: 
    05 2012 
    06 2012 
    07 2012 
    08 2012 
*/ 
?> 

http://codepad.org/auYLHvDI

Смежные вопросы