Странное поведение моего кода с strtotime - PullRequest
1 голос
/ 08 апреля 2011

У меня некоторые проблемы с датами в PHP. Я получаю некоторые данные из формы и пытаюсь «отправить» их с помощью вызова ajax, чтобы обновить Интернет без перезагрузки страницы.

У меня есть средство выбора даты, которое позволяет выбирать диапазон дат, и поэтому я сделал грязную функцию, чтобы отделить начальную и конечную даты и опубликовать ее отдельно в PHP (в случае, если выбран диапазон дат). Они формируются таким образом: 01/04 / 2011,08 / 04/2011

В PHP, поэтому у меня есть переменные даты, и я пытаюсь отформатировать их для выполнения некоторых запросов к базе данных следующим образом:

$date_start = $_POST['date_start'];
$date_start_form = date("Y-m-d",  strtotime($date_start));

После некоторого тестирования я обнаружил, что если дата выше 12-го дня того или иного месяца, а затем попытаться отформатировать его, это возвращает мне 1970-01-01.

Кто-то знает, почему это происходит?

Ответы [ 6 ]

2 голосов
/ 08 апреля 2011

Кстати, способ решения проблемы - не использовать / в качестве разделителя даты, если - или. используется как 08.04.2011 или 08-04-2011, тогда предполагается, что используется европейский метод.

Если вы можете получать даты только в формате 08/04/2011, то об этом позаботится простое место str_replace:

$date = "08/04/2011";
$date = str_replace('/','.',$date); //08.04.2011
echo date('Y-m-d',strtotime($date));  //2011-04-08
1 голос
/ 08 апреля 2011

Они форматируются таким образом: 01/04 / 2011,08 / 04/2011

В этом, вероятно, ваша проблема: если эти даты предполагаются в апреле, вы используетеевропейский способ написания дат.strtotime ожидает американские даты, поэтому он, вероятно, интерпретирует месяц как день, а также день месяца (и поэтому он прерывается, если день больше 12).

Википедия: Нотация даты и времени в Соединенных Штатах

0 голосов
/ 12 апреля 2011

Если вы используете php => 5.3, возможно, стоит посмотреть на DateTime :: createFromFormat функцию. Для вашего случая это может быть реализовано так:

$date = "08/04/2011";
$date_object = DateTime::createFromFormat('d/m/y', $date);
$timestamp = $date_object->getTimestamp();
0 голосов
/ 08 апреля 2011

Это проблема часового пояса. Strtotime принимает это во внимание. Вы можете установить правильный с помощью

date_default_timezone_set('Europe/London');

или до вызова strtotime. См. Список поддерживаемых часовых поясов .

0 голосов
/ 08 апреля 2011

Насколько я вижу, strptime - единственная функция php, которая принимает дату в виде строки, и формат даты , с возвращенным массивом вы можете сгенерировать метку времени.

Например:

$timeArr = strptime($date_start ,"DD/MM/YY");
$timestamp = mktime(0, 0, 0, $timeArr['tm_mon']+1, $timeArr['tm_mday'], $timeArr['tm_year']);
$date_start_form = date("Y-m-d", $timestamp);

или вы можете построить строку напрямую, например:

$timeArr = strptime($date_start ,"DD/MM/YY");
$date_start_form = sprintf(%d-%d-%d, $timeArr['tm_year'], $timeArr['tm_mon']+1, $timeArr['tm_mday']);

Хотя, подумав об этом, вы можете просто рассматривать дату поступления как строку, которую нужно переставитьи игнорируйте тот факт, что это дата, например:

$timeArr = explode($date_start ,"/");
$date_start_form = sprintf(%d-%d-%d, $timeArr[2], $timeArr[1], $timeArr[0]);
0 голосов
/ 08 апреля 2011

Звучит так, как будто вы перепутали день и месяц.Когда вы передаете их в strtotime (), ожидается, что месяц будет вторым, а не первым числом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...