PHP: Дата синтаксиса из локализованного формата

Мне нужно проанализировать строку даты в многоязычном приложении. У каждого пользователя есть свой язык, а затем формат даты.

Как использовать:

new DateTime($datestr);

или

date_parse($datestr);

с локализованным форматом даты?

Предполагая, что mm/dd/yyyy в формате EN и dd/mm/yyyy, как формат даты IT, я выполнил этот тест:

<?php
echo "EN locale<br>\r\n";
setlocale(LC_ALL, 'en_US');
$date="01/02/2015"; //2th Jan
$date_array=date_parse($date);
$mktime=mktime($date_array['hour'], $date_array['minute'], $date_array['second'], $date_array['month'], $date_array['day'], $date_array['year']);
$datetime=new DateTime($date);    
echo date("Y-m-d",$mktime);
echo "<br>\r\n";
echo $datetime->format('Y-m-d');
echo "<br>\r\n";

echo "IT locale<br>\r\n";
setlocale(LC_ALL, 'it_IT');
$date="01/02/2015"; //1th Feb
$date_array=date_parse($date);
$mktime=mktime($date_array['hour'], $date_array['minute'], $date_array['second'], $date_array['month'], $date_array['day'], $date_array['year']);
$datetime=new DateTime($date);    
echo date("Y-m-d",$mktime);
echo "<br>\r\n";
echo $datetime->format('Y-m-d');

В результате получается SAME, при этом оба параметра locale имеют синтаксический анализ формата mm/dd/yyyy. Выход всегда был 2015-01-02 (2 февраля)

Ответы

Ответ 1

Это ответ:

$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::SHORT, IntlDateFormatter::NONE);
$unixtime=$formatter->parse($date);

И это предыдущий тест, работающий с моим ответом.

<?php
echo "EN locale<br>\r\n";
$date="01/02/2015"; //2th Jan
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::SHORT, IntlDateFormatter::NONE);
$unixtime=$formatter->parse($date);
$datetime=new DateTime();
$datetime->setTimestamp($unixtime);
echo $datetime->format('Y-m-d');
echo "<br>\r\n";

echo "IT locale<br>\r\n";
$date="01/02/2015"; //1th Feb
$formatter = new IntlDateFormatter("it_IT", IntlDateFormatter::SHORT, IntlDateFormatter::NONE);
$unixtime=$formatter->parse($date);
$datetime=new DateTime();
$datetime->setTimestamp($unixtime);
echo $datetime->format('Y-m-d');
echo "<br>\r\n";

К сожалению, я не могу заработать свою награду...: -)

Ответ 2

<?php
echo "EN locale<br>\r\n";
setlocale(LC_ALL, 'en_US');
$date="01/02/2015"; //2th Jan
$date_array=date_parse($date);
$mktime=mktime($date_array['hour'], $date_array['minute'], $date_array['second'], $date_array['month'], $date_array['day'], $date_array['year']);
$datetime=new DateTime($date);    
echo date("m/d/Y",$mktime);
echo "<br>\r\n";
echo $datetime->format('m/d/Y');
echo "<br>\r\n";

echo "IT locale<br>\r\n";
setlocale(LC_ALL, 'it_IT');
$date="01/02/2015"; //1th Feb
$date_array=date_parse($date);
$mktime=mktime($date_array['hour'], $date_array['minute'], $date_array['second'], $date_array['month'], $date_array['day'], $date_array['year']);
$datetime=new DateTime($date);    
echo date("d/m/Y",$mktime);
echo "<br>\r\n";
echo $datetime->format('d/m/Y');

Это изменения, но вы должны иметь возможность копировать и вставлять код выше, и он будет работать так, как вы хотите.

echo date("d/m/Y",$mktime);
echo date("m/d/Y",$mktime);
echo $datetime->format('m/d/Y');
echo $datetime->format('d/m/Y');

Referance http://php.net/manual/en/function.date.php