PHP формат даты в выпадающем списке не работает

#php #date #date-format

#php #Дата #дата-формат

Вопрос:

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

Он отлично работает как таковой, однако на выходе не отображается правильная дата, вместо этого отображается 1 января 1970 года

 $timestamp = strtotime('today');
$output = [];
for ($day = 0; $day < 21; $day  ) {
    $output[] = date('d M y', strtotime(sprintf(' %d days', $day), $timestamp));
}
echo "<select name='days'>";
    foreach ($output as $day)
    {
        echo "<option value='".$day."'>".date('l jS of F Y',$day)."</option>";
    }
echo "</select>";
  

если я повторяю только $ day в качестве выходного значения, оно отображается в формате ДД / ММ / ГГГГ, но я хочу, чтобы оно отображало название дня, дату месяца, год

итак, что не так с использованием

 date('l jS of F Y',$day)
  

Я уверен, что это что-то глупое, но я проверил все различные сообщения о дате, но я ни за что на свете не могу понять это.

Ответ №1:

Функция date() принимает в качестве второго аргумента время в секундах.

Ответ №2:

Если вы посмотрите документацию PHP:date, вы обнаружите, что второй аргумент ожидает целое число, а не строку.

Измените свой код на следующий:

 <?php

$output = [];
for ($day = 0; $day < 21; $day  ) {
    $output[] = strtotime(sprintf(' %d days', $day));
}
echo "<select name='days'>";
foreach ($output as $day)
{
    echo "<option value='".$day."'>".date('l jS of F Y', $day)."</option>";
}
echo "</select>";
  

Вместо того, чтобы заполнять ваш выходной массив строками, вы увидите здесь, что вместо этого мы заполняем его 21 метками времени.

Как только вы начнете перебирать свой выходной массив, передача метки времени во второй аргумент функции date приведет к ожидаемому результату.

Я сохраняю значение каждого параметра, установленное на эту временную метку, поскольку это упрощает работу, если вам нужно обработать какие-либо данные POST. Но вы можете настроить форматирование там по мере необходимости.

Вот рабочий пример, с которым вы можете поиграть.

Редактировать:

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

 <?php

$today = new DateTime();
echo "<select name='days'>";
for ($day = 0; $day < 21; $day  )
{
    echo "<option value='".$today->getTimestamp()."'>".$today->format('l jS of F Y')."</option>";
    $today->add(new DateInterval("P1D"));
}
echo "</select>";
  

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

1. Спасибо кучам … теперь имеет смысл)