Я странный с поведением strtotime - PullRequest
1 голос
/ 11 марта 2012

Я получаю дату от и до, используя плагин jquery datepicker. Ниже вывод POST.

Array (
    [fromDate] => 01/03/2012
    [toDate] => 15/03/2012
    [hdnDownload] => Download
) 

Я пытаюсь преобразовать этот формат даты в другой формат даты, например:

echo'fromdate'.$fromDate = date("Y/n/j", strtotime($_POST['fromDate']));
echo'todate'.$toDate = date("Y/n/j", strtotime($_POST['toDate']));

Это дает мне следующий вывод:

fromdate: 2012-1-3
todate:1969-12-31

С fromDate все в порядке, но ToDate изменился, не могли бы вы мне помочь.

Ответы [ 4 ]

2 голосов
/ 11 марта 2012

Вы, вероятно, должны использовать DateTime::createFromFormat():

php > $date = DateTime::createFromFormat('i/n/Y', '15/03/2012');
php > echo $date->format('Y/n/j');
// 2012/3/11

Это полезно, потому что вы можете указать формат ввода. xx/yy/YY может быть представлен либо как i/n/Y, так и n/i/Y, и, следовательно, дата неоднозначна => непредсказуемое поведение.

2 голосов
/ 11 марта 2012

Чтобы убедиться, что вы получите правильный результат, вам нужно либо DateTime :: createFromFormat () , если вы используете PHP> = 5.3.0, либо strptime () сPHP> = 5.1.0, где вы можете указать формат ввода.

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

function parsedate($date) {
    if (preg_match('#\d{1,2}/\d{1,2}/\d{2,4}#', $date)) {
        $parsed = strptime($date, '%m/%d/%Y');
        return mktime(0, 0, 0, $parsed['tm_mon'], $parsed['tm_mday'], 1900+$parsed['tm_year']);
            // 'tm_year' is years since 1900
    } else {
        return strtotime($date);
    }
}

Это все еще опора, но я не вижу более чистого пути.

0 голосов
/ 11 марта 2012

Значение fromDate также неверно, так как вы хотели, чтобы 03 был месяцом, а не 1.

В вашем случае strtotime считает, что вводом является месяц / день / год, и поскольку 15 не является месяцем, он ошибается.

Вы можете поменять местами входные строки на

[fromDate] => 03/01/2012
[toDate] => 03/15/2012

или использовать createFromFormat в ответе @ Vyktor.

0 голосов
/ 11 марта 2012

strtotime() может дать неожиданные результаты, если ввод неверен или искажен.Казалось бы, ваш $_POST['toDate'] недействителен для strtotime для правильной работы.

Дата, которую вы получаете, является начальной датой Unix Time в вашем часовом поясе.

Я бы предложил использовать что-то отличное от strtotime, например класс DateTime или функцию date().

...