Понимание обработки даты с помощью strtotime - PullRequest
1 голос
/ 28 февраля 2012

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

$date = strtotime("midnight", strtotime($dateString));

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

Я мог бы удалить "полночь", но я не уверен, каковы будут последствия этого - есть ли причина, по которой полночь могла быть там?

РЕДАКТИРОВАТЬ: это полный блок кода, который обрабатывает дату. Дата содержит время, которое позволяет пользователю опубликовать элемент в определенное время.

            $array['display_date'] = '24 October, 2011 17:30';
            $string = $array['display_date'];
            $dateString = substr($string, 0, -5);

            $timeArray = explode(':', substr($string, -5));
            $hours_in_secs = 60 * 60 * $timeArray[0];
            $mins_in_secs = $timeArray[1];
            $date = strtotime("midnight", strtotime($dateString));

            $timestamp = $date + $hours_in_secs + $mins_in_secs;

            //assign timestamp to validation array
            $array['display_date'] = $timestamp;
            echo $array['display_date']; // Output = 1351094430 (Oct 24 2012 17:00:30)

1 Ответ

4 голосов
/ 28 февраля 2012

Это действительно зависит от того, что содержит $dateString.Предполагая, что ваш виджет jQuery также доставил часть времени, ваш коллега, вероятно, хотел удалить часть времени.Сравните следующее:

echo date(DATE_ATOM, strtotime('2010-10-01 17:32:00'));
// 2010-10-01T17:32:00+02:00

echo date(DATE_ATOM, strtotime("midnight", strtotime('2010-10-01 17:32:00')));
// 2010-10-01T00:00:00+02:00

Если ваш виджет не возвращает часть времени, я не вижу причин для установки даты на полночь, потому что это будет автоматически полночь:

echo date(DATE_ATOM, strtotime('2010-10-01'));
// 2010-10-01T00:00:00+02:00

Обратите внимание, что все эти являются датами в прошлом, и они приведут к данному году в прошлом, а не к текущему, как вы говорите.Если они есть в вашем коде, причина должна быть где-то еще.

Будут ли последствия при изменении кода?Мы не можем знать.Это всего лишь одна строка кода, и мы понятия не имеем о каком-либо контексте.Ваши модульные тесты должны сообщать вам, когда что-то ломается, когда вы меняете код.

РЕДАКТИРОВАТЬ после обновления

Кодовый блок, который вы показываете, не имеет никакого смысла вообще,Спросите парня, который написал это, что он должен делать.Он не только неверно вернет текущий год за прошлые годы, но также даст неверные результаты для минут, например

24 March, 2010 17:30 will be 2012-03-24T17:00:30+01:00

Я предполагаю, что это была попытка превратить 24 March, 2010 17:30 в действительную метку времени,который в формате strtotime не распознает.Но подход сломан.Если вы используете PHP5.3, используйте

$dt = DateTime::createFromFormat('d F, Y H:i', '24 March, 2010 17:30');
echo $dt->format(DATE_ATOM); // 2010-03-24T17:30:00+01:00

. Если вы еще не используете 5.3, пройдите через https://stackoverflow.com/search?q=createFromFormat+php для альтернативных решений.Там есть пара.

...