#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. Если установлен только день, как в решении Джона Конде, дата всегда содержит текущее время.