2016-05-19 2 views
1

Я пытаюсь отформатировать даты из британского формата в ГГГГ-ММ-ДД, получая странные результаты.PHP - проблема с форматированием даты

код я использую:

echo "<br>".$_GET['trans_date']; 
echo "<br>".$_GET['next_payment']; 
echo "<br>".$_GET['payment_date']; 
echo "<br><br>".date("Y-m-d", strtotime($_GET['trans_date'])); 
echo "<br>".date("Y-m-d", strtotime($_GET['next_payment'])); 
echo "<br>".date("Y-m-d", strtotime($_GET['payment_date'])); 

И я получаю следующие результаты:

19/05/2016 
01/06/2016 
19/05/2016 

1970-01-01 
2016-01-06 
1970-01-01 

Я ожидаю следующие результаты:

19/05/2016 
01/06/2016 
19/05/2016 

2016-05-19 
2016-01-01 
2016-05-19 

Может кто-нибудь, что происходит неправильно?

Спасибо,

Джон

+0

Согласно [PHP документации] (http://www.php.net/manual/en/datetime.formats.date.php): когда PHP встречает '/' в дате с структурой 'xx/xx/xxxx', он рассматривает ее как формат США (' mm/dd/yyyy') .... либо меняет '/' на ' -' перед использованием 'strtotime()' или использовать [DateTime :: createFromFormat()] (http://nl3.php.net/manual/en/datetime.createfromformat.php) для создания объекта DateTime –

+0

Функция strtotime ожидает получить строку, содержащую английский формат даты (мм/дд/гггг) –

ответ

1

Это должно работать:

echo "<br><br>".date("Y-m-d", strtotime(str_replace('/', '-', $_GET['trans_date']))); 
echo "<br>".date("Y-m-d", strtotime(str_replace('/', '-', $_GET['next_payment']))); 
echo "<br>".date("Y-m-d", strtotime(str_replace('/', '-', $_GET['payment_date']))); 
+0

Отлично, спасибо! –

1

Просто Установить Вы дали дату 05/19/2016 означает формат mm/dd/yy и это будет исправлено.

2

Вы не можете установить языковой стандарт для strtotime.

Если вы американец, вы видите 11/12/10 и думаете «12 ноября 2010 года».

Если вы австралиец (или европейский), вы думаете, что это «11 декабря 2010 года».

Если вы системный администратор, который читает ISO, он выглядит как «10 декабря 2011 года».

Лучший способ компенсировать это путем изменения ваших символов соединения.

косой чертой (/) означает, американский M/D/Y, форматирование, тире (-) (.) Означает европейский D-M-Y и периода означает ИСО Y.M.D.

Итак, Мое предложение всегда использует объект DateTime для дат, чтобы избежать ненужных ошибок.

Ex: $date = DateTime::createFromFormat('j-M-Y', '15-Feb-2009'); 
echo $date->format('Y-m-d'); 

Приходя к вашему вопросу, решение:

$trans_date = DateTime::createFromFormat('d/m/Y', $_GET['trans_date']); 
$next_payment_date = DateTime::createFromFormat('d/m/Y', $_GET['next_payment']); 
$payment_date = DateTime::createFromFormat('d/m/Y', $_GET['payment_date']); 

echo "<br><br>".$trans_date->format('Y-m-d'); 
echo "<br>".$next_payment_date->format('Y-m-d'); 
echo "<br>".$payment_date->format('Y-m-d'); 
Смежные вопросы