PHP strtotime () похож на него, ожидает Европейский формат

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

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

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

Существует ли путь вокруг этого? Или я должен прекратить использовать strtotime ()?

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

7
задан rhodesjason 5 February 2010 в 13:33
поделиться

3 ответа

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

03-02-01  => 1. february 2003 (ISO)
01.02.03  => 1. february 2003 (European)
02/01/03  => 1. february 2003 (US)
7
ответ дан 6 December 2019 в 15:21
поделиться

Проблема в том, что на самом деле это не то, как быстро работает. Quicksort - рекурсивный алгоритм, который должен вызываться только один раз вне себя. Идея заключается в том, что при каждой итерации массив разделяется на две половины - левая половина содержит все элементы, меньшие, чем ось вращения, а правая половина содержит все элементы, превышающие/равные оси вращения. Затем вы ускорите две половины и, наконец, положите ось в середине.

Если сторона быстрой сортировки имеет длину менее 3 элементов, можно просто поменять местами два элемента или оставить их, и эта часть массива будет выполнена.

Но не похоже, что ваш код делает это вообще - вы звоните Quicksort 6 раз от вашего клиента, и в рамках функции quicksort вы делаете максимум один своп. Так что это не тот случай, когда кто-то сможет посмотреть на ваш код и отладить его, сказав вам перенести обмен или что-то еще. Вам нужно вернуться к своей логике.

Просмотрите диаграмму Википедии для наглядного примера того, что должно произойти в одной итерации:

http://en.wikipedia.org/wiki/File: Partition _ example.svg

-121--4222964-

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

Я ожидаю, что дочерняя форма отслеживала, когда ее родитель может закрыться (это обычный случай использования) и она не отписалась от события FormClosing или FormClosed , когда она получила это событие. Однако, это всего лишь предположение. Чтобы подтвердить, просмотрите реализацию дочерней формы и найдите все случаи, когда она подписывается на события из родительской формы, а затем убедитесь, что имеется соответствующая отмена подписки на эти события.

Обновить
Обнаруженный обработчик меню, который не был удален, вполне может быть корнем проблемы. Попробуйте добавить вызов remove и проверьте, устранена ли утечка.

-121--4407459-

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

6
ответ дан 6 December 2019 в 15:21
поделиться

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

1
ответ дан 6 December 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: