php формат даты вставка неверной даты - PullRequest
2 голосов
/ 26 июля 2011

Я не понимаю, почему этот фрагмент кода не преобразует дату в британском формате 00/00/0000 в формат даты mysql 0000-00-00. То, что я получаю в БД, это 1970-01-01. Это в формате даты, а не в datetime, так что должно работать? Спасибо

$destroy = mysql_real_escape_string($_POST['destroy']);
$desttempdate=str_replace("-", "/", $destroy); 
$destdate = date('Y-m-d', strtotime($desttempdate));

Ответы [ 3 ]

3 голосов
/ 26 июля 2011

Вот несколько вариантов, как заставить его работать:

Примерно так для PHP4:

function date2timestamp($date,$seperator='/'){
    if($date!=''){
        $dateEx = explode($seperator,$date);
        $date = (strlen($dateEx[2])==2?'20'.$dateEx[2]:$dateEx[2]).'-'.$dateEx[1].'-'.$dateEx[0].' 00:00:00';
    }
    return $date;
}

Для PHP5.3 использовать createFromFormat () :

$date = DateTime::createFromFormat('j/M/Y', $UK_date);
echo $date->format('Y-m-d');

Также другие опции для createFromFormat () в PHP5.2 включают в себя:

2 голосов
/ 26 июля 2011
Функция

strtotime() вернет метку времени Unix, а дата 0000-00-00 не вписывается в это значение - вместо этого вы получите 0 (ноль), который будет правильно преобразован в 1970-01-01.

* 1006.* Вы можете делать то, что вы хотите, делая что-то вроде этого:
$destdate = mysql_real_escape_string($_POST['destroy']); // assuming YYYY/MM/DD
$destdate = str_replace('/', '-', $destdate);
if ($destdate != '0000-00-00'){
    $destdate = date('Y-m-d', strtotime($desttempdate));
}
1 голос
/ 26 июля 2011

Проблема в том, что вы переходите на strtotime, что он считает недопустимой датой. В документации написано:

Примечание:

Даты в форматах m / d / y или d-m-y неоднозначны, если посмотреть на разделитель между различными компонентами: если разделитель является косая черта (/), тогда предполагается американский м / д / у; тогда как если разделитель - тире (-) или точка (.), затем европейский формат d-m-y предполагается.

Чтобы избежать двусмысленности, лучше всего использовать ISO 8601 (ГГГГ-ММ-ДД) даты или DateTime :: createFromFormat (), когда это возможно.

То, что здесь происходит, заключается в том, что вы передаете строку, используя разделитель /, что означает, что strtotime пытается проанализировать ее как m/d/y вместо d/m/y. Либо вообще не делайте замену, если ваша дата в европейском формате, или, что еще лучше, используйте DateTime::createFromFormat(), как подсказывают документы.

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

$destroy = mysql_real_escape_string($_POST['destroy']);
$desttempdate=str_replace("-", "/", $destroy);
var_dump(strtotime($desttempdate));

Это выведет "bool (false)", подтверждая, что strtotime не может проанализировать его ввод.

Решение:

Как уже упоминалось выше, предпочитайте DateTime::createFromFormat():

$date = DateTime::createFromFormat('d/m/Y', $_POST['destroy']);
$destdate = $date->format('Y-m-d');

В противном случае, даже если я не рекомендую такой подход, самый простой способ решения проблемы - просто пропустить str_replace:

$destdate = date('Y-m-d', strtotime($_POST['destroy']));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...