Даты PHP меня расстраивают

#php #datetime

#php #datetime

Вопрос:

Я пытаюсь проверить ввод в mm/yyyy формате, округляя строку. Проблема:

 <?php
$datestr = "06/2017";

$realdate = DateTime::createFromFormat('m/Y', $datestr);
$datestr2 = date_format($realdate,'m/Y');

echo "date in: $datestrn";
echo "date out: $datestr2n";
?>
 

выдает следующее:

дата в: 06/2017
дата истекла: 07/2017

Почему второе значение увеличивается в месяц?

Комментарии:

1. Даты PHP (либо времена Unix, либо объекты DateTime) всегда имеют год, месяц, день, час, минуты, секунды и часовой пояс. Если вы не задаете их явно, вы просто получаете значение по умолчанию. Если вы сомневаетесь, всегда проверяйте свои переменные в вашем отладчике или var_dump() в них.

2. Извините, конечно, у времени Unix нет часового пояса. Вы получаете его при преобразовании из / в строку.

Ответ №1:

Поскольку вы не указали день, который он предполагает сегодня (31-е). 31 июня не существует, поэтому PHP предполагает 1 июля.

Предполагая, что вы всегда работаете с форматами дат, которые используете в своем примере, вы можете легко обойти это, указав первое число месяца для своих дат:

 $datestr = "01/06/2017";

$realdate = DateTime::createFromFormat('d/m/Y', $datestr);
$datestr2 = date_format($realdate,'m/Y');

echo "date in: $datestrn";
echo "date out: $datestr2n";
 

ДЕМОНСТРАЦИЯ

Ответ №2:

Нет необходимости указывать день ’01’. A ! в формате сбрасывает все поля (год, месяц, день, час, минута, секунда). Без ! все поля будут заданы на текущую дату и время. (-> Руководство по PHP)

 $datestr = "06/2017";

$realdate = DateTime::createFromFormat('!m/Y', $datestr);
var_dump($realdate);
/*
object(DateTime)#2 (3) {
 ["date"]=> string(26) "2017-06-01 00:00:00.000000" 
 ["timezone_type"]=> int(3) 
 ["timezone"]=> string(13) "Europe/Berlin" 
}
*/
 

С помощью! несуществующий день всегда устанавливается равным 1, а время — 00:00:00. Если установлен только день, как в решении Джона Конде, дата всегда содержит текущее время.