2015-07-23 17 views
16

Ho bisogno di analizzare una stringa di data in un'applicazione multilingue. Ogni utente ha le proprie impostazioni internazionali e quindi il loro formato data.PHP: Parse date from localized format

Come usare:

new DateTime($datestr); 

o

date_parse($datestr); 

con il formato della data localizzato?

Supponendo gg/mm/aaaa come EN formato della data e gg/mm/aaaa come IT formato della data che ho fatto questo test:

<?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'); 

Il risultato è l'uscita STESSO, con entrambe le impostazioni internazionali parse è fornito con il formato mm/gg/aaaa. L'uscita era sempre 2015/01/02 (2 febbraio)

+0

vedono questa domanda simile a quello che avete bisogno http://stackoverflow.com/questions/8827514/get-date-format-according- to-the-locale-in-php. sarà necessario utilizzare 'set_locale' insieme a' getDateFormat' –

+0

Perché non riesco a trovare alcun documento su getDateFormat()? – Tobia

+0

scuse @Tobia, ero di fretta a scrivere il mio commento, getDateFormat, è una funzione personalizzata che restituirà il formato della data a seconda delle impostazioni internazionali –

risposta

6

Questa è la risposta:

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

e questo è il test precedente a lavorare con la mia risposta.

<?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"; 

Purtroppo non riesco a guadagnarmi taglia ... :-)

-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'); 

Questi sono i cambiamenti, ma si dovrebbe essere in grado di copiare e incollare il codice qui sopra e funzionerà nel modo desiderato.

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

+1

Mi stai prendendo in giro? La tua soluzione è di cambiare manualmente il formato della data ... Voglio analizzare la data in base alle impostazioni locali dell'utente che possono essere chiunque. Nella mia domanda ho scritto questo codice 'echo date (" Y-m-d ", $ mktime);' per mostrare che con le differenze locali la data analizzata era la stessa. – Tobia

+0

Non credo che ci sia un modo in PHP per automatizzare ciò che vuoi automatizzato. Penso che debba essere fatto manualmente. – kayleighsdaddy

+0

Sarebbe un peccato ... perché il processo opposto (formatta una data in base alle impostazioni locali dell'utente) esiste, quindi le informazioni sul formato della data locale esistono da qualche parte nelle librerie php. – Tobia