PHP strtotime () выглядит так, как будто он ожидает формат евро - PullRequest
7 голосов
/ 05 февраля 2010

Я использовал PHP-метод strtotime (), чтобы принять поле даты в форме. Мне нравится, насколько он силен, как он примет «Завтра», «Следующий четверг» или (предположительно) любое представление даты и преобразует его в метку времени Unix.

Работает отлично - до вчерашнего дня. Кто-то ввел «2-4-10» и вместо регистрации 4 февраля 2010 года он записал 10 апреля 2002 года! Так что ожидалось Y-M-D вместо M-D-Y.

Я подумал, что, возможно, проблема в том, чтобы использовать год из двух цифр, поэтому мы попробовали еще раз с "2-4-2010". Это записано 2 апреля 2010 года! В этот момент я просто не понимаю, что делает strtotime (). PHP.net говорит, что ожидает американский формат даты на английском языке. С чего бы это тогда предполагать D-M-Y?

Есть ли способ обойти это? Или я должен прекратить использование strtotime ()?

Примечание: Я только что сделал тест. Когда вы используете косую черту вместо дефиса / тире, она отлично работает даже с 2/4/10. Почему на земле это имеет значение? И если это все, что нужно, нужно ли просто запустить str_replace ("-", "/", $ input) на входе формы перед передачей его в strtotime ()?

Ответы [ 4 ]

7 голосов
/ 05 февраля 2010

- указывает дату ISO:

03-02-01  => 1. february 2003 (ISO)
01.02.03  => 1. february 2003 (European)
02/01/03  => 1. february 2003 (US)
6 голосов
/ 05 февраля 2010

Поведение strtotime() в значительной степени основано на спецификации форматов GNU . Но как бы он ни был силен, не следует ожидать, что он будет читать мысли. Разрешение ввода даты в произвольной форме требует постоянных проблем.

1 голос
/ 14 апреля 2010

У меня была эта проблема, и я решил ее, выполнив в точности то, что вы предложили - введите str_replace в дату, указанную пользователем, чтобы заменить тире косыми чертами. Это не позволяет strtotime использовать дату ISO и решает проблему.

0 голосов
/ 12 октября 2010

strtotime по своей природе нечетко, поэтому вы не можете предполагать, что оно всегда будет делать то, что вы хотите. Если вы введете 2010-04-02, то ожидаете, что он вернется 2 апреля 2010 года, что и пытается сделать strottime. Выполнение str_replace от дефиса до косой черты может означать, что люди, входящие в этот формат, получают неправильную дату.

Если вы используете PHP 5.3 или выше, рассмотрите date_parse_from_format () или для PHP 5.1 и выше в Unix рассмотрите strptime (). Обе функции принимают формат, поэтому устраните потенциальную двусмысленность (если вы сообщаете пользователям, какой формат вы ожидаете - если вы работаете на международном сайте и у вас есть текстовое поле с надписью дата, в которую пользователь вводит 4/4/2010, то нет способ узнать, какова их предполагаемая дата).

...