2012-05-31 6 views
11

У меня есть странное поведение с классом DateTime.
Сегодня 2012-05-31. Часовой пояс - «Европа/Вильнюс».
После кодаКласс DateTime и последний месяц

$date = new DateTime('last month'); 
echo $date->format('Y-m-d'); 

выходов 2012-05-01. Это ошибка php? Кстати, $date = new DateTime('-1 month'); выдает то же самое.

+2

'Обратите внимание, что« -1 месяц »может привести к неожиданному результату при использовании в последний день месяца, который имеет 31 день [Источник] (http://www.php.net/manual/de/datetime.formats.relative .php # 102947), кажется, что то же самое для 'last month' –

+1

Угадайте, что вы правы, это поведение выглядит как ошибка. Проверьте комментарии на http://www.php.net/manual/en/datetime.formats.relative.php – CodeZombie

+1

Просьба сообщить об этом как об ошибке. Спасибо. – CodeZombie

ответ

18

Это, как представляется, особый случай, в течение нескольких месяцев с 31 дней:

Обратите внимание, что ' -1 месяц»может привести к неожиданному результату при использовании в последний день месяца, который имеет 31 дней (от http://www.php.net/manual/de/datetime.formats.relative.php#102947)

Что вы можете сделать, это:

$date = new DateTime('last day of last month'); // this is "2012-04-30" now 
/// 'first day of last month' would work either, of course 

А потом это зависит от того, что вы собираетесь делать с датой.

+0

Не неожиданно, если вы знаете, что означает '-1 месяц'. Это объясняется где-то еще, но мы слишком ленивы, чтобы искать дубликат на этом сайте, не так ли? – hakre

+1

Нет, я не слишком ленив, у меня просто нехватка времени. И в любом случае, это не должно быть моей ответственностью. Я просто пытаюсь помочь :). Похоже, это помогло –

+0

Эй, я не сказал, что это твоя работа. Я тоже слишком ленив;) – hakre

7

Я думаю, что вы должны иметь DateTime, которые уже существуют, и изменить его, как это:

<?php 
$d = new DateTime(date("Y-m-d")); 
$d->modify('last day of previous month'); 
echo $d->format('Y-m-d'), "\n"; 
?> 
Смежные вопросы