Мне нужно проанализировать строку даты в многоязычном приложении. У каждого пользователя есть свой язык, а затем формат даты.
Как использовать:
new DateTime($datestr);
или
date_parse($datestr);
с локализованным форматом даты?
Предполагая, что mm / dd / yyyy соответствует формату даты EN и dd / mm / yyyy в формате IT date, я сделал этот тест:
<?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("Ymd",$mktime); echo "<br>\r\n"; echo $datetime->format('Ym-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("Ymd",$mktime); echo "<br>\r\n"; echo $datetime->format('Ym-d');
Результатом является SAME-выход, причем оба языковых настроек имеют синтаксический анализ с форматом mm / dd / yyyy. Выход всегда был 2015-01-02 (2 февраля)
Это ответ:
$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('Ym-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('Ym-d'); echo "<br>\r\n";
К сожалению, я не могу заработать свою щедрость … 🙂
<?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');