2013-09-06 3 views
1

У меня есть веб-сайт, для которого требуется, чтобы пользователь вводил дату, которая затем хранится в базе данных MySQL. Я хотел бы, чтобы пользователь вводил дату в m/d/yyyy и преобразовал ее в формат Y-m-d, который требуется MySQL. Я подумал, что было достаточно просто, но я не могу заставить его прекратить делать серьезную ошибку,Преобразование между форматами даты в PHP

Я попытался следующие:

$date = new DateTime($this->vital_date); 
$this->vital_date = $date->format('Y-m-d'); 

Когда пользователь вводит 9/6/2013, 2013 -06-09 хранится в таблице MySQL. (Обратите внимание на перестановку месяца и даты

Затем я попробовал старый, предварительно объектного путь:..

$date = strtotime($this->vital_date); 
$this->vital_date = date('Y-m-d', $date); 

И что сделало то же самое - транспонированный месяц и дату

может кто-нибудь дать мне любую помощь на то, что я делаю неправильно или как я мог бы сделать лучшее преобразование.

+2

Вместо того чтобы использовать прямую DateTime, используйте статический метод [DateTime :: createFromFormat()] (http://www.php.net/manual/en/datetime.createfromformat.php), где вы указываете формат строки даты –

+0

Возможно, все в порядке, но ваш mysql использует неправильный (европейский) формат? Вы пытались сохранить дату и получить ее снова? – cerkiewny

ответ

3

Y НУ должны использовать DateTime::createFromFormat

От PHP DOC

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

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

Пример

$vital_date = "9/6/2013"; 
$date = DateTime::createFromFormat("m/d/Y", $vital_date); 
echo $date->format('Y-m-d'); 
+0

Вы должны использовать 'n' за месяц и' j' за день.В противном случае ожидаются ведущие нули в формате. – Fluffeh

+0

Это тоже будет работать. Просто будет немного медленнее. –

+0

Невозможно увидеть какие-либо проблемы в вашем eval. Вам нужно поменять 'j' и' n', поэтому форматы будут равны :) –

1

Вы можете указать формат, который вы даете данные следующим образом:

$date = DateTime::createFromFormat('j/n/Y', '9/6/2013'); 
0

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

или номер водительского удостоверения можно надлежащим образом обрабатывать и хранить в базе данных, форматируя его, используя scanf, например, scanf($input, '%s-%s-%d/%d); и т.д.

это зависит от ваших потребностей, так что вы должны знать о sscanf, scanf, printf, sprintf, vsprintf

<?php 
$date = '9/6/2013'; 

    list($month,$day,$year) = sscanf($date, '%d/%d/%d'); 

    $date = sprintf('%d-%02d-%02d',$year,$month,$day); 

echo $date; 
?> 
Смежные вопросы