2012-01-11 9 views
9

C'è un problema molto semplice. Ho un identificatore di localizzazione, en, en_US, cs_CZ o qualsiasi altra cosa. Ho solo bisogno di ottenere il formato data-ora per quella locale. So che posso facilmente formattare qualsiasi timestamp o oggetto data in base alle impostazioni locali. Ma ho bisogno solo della rappresentazione della stringa del formato data, diciamo un'espressione regolare. C'è qualche funzione che gestisce questa funzionalità? Non ho trovato alcun finora ...Ottieni il formato della data in base alle impostazioni locali in PHP

exapmle:

$locale = "en_US"; 
$format = the_function_i_need($locale); 
echo $format; // prints something like "month/day/year, hour:minute" 
+0

Sono d'accordo con @dagon. e impostare PHP per seguire l'UTC renderà molto più semplice. – ThinkingMonkey

+1

@Dagon Credo che il tuo commento sia più accurato, dovresti metterlo come risposta. –

risposta

2

convertiti dal commento:

si dovrà costruire una matrice con un elenco delle possibilità.

http://en.wikipedia.org/wiki/Date_format_by_country dovrebbe aiutare.

inviare la funzione da qualche parte una volta fatto, sono sicuro che sarebbe venuto in aiuto per gli altri

+0

questo è un consiglio, ma non rispondere – verybadbug

+0

mi è stato chiesto di trasformare il commento in risposta, e così ho fatto. –

0

Usa strftime() in collaborazione con setlocale(). Sembra che sia quello che stai cercando.

+0

Grazie per la risposta, ma è il contrario. Se no, non seguo la tua idea. Potresti scrivere un breve esempio, per favore? –

+2

ah, penso di capire ora. 'strftime()' convertirà il tempo e la lingua dell'output, ma per il formato effettivo come "yyyy-mm-dd" in Canada invece di "gg/mm/aaaa" in Albania, credo che dovrai usare Dagon's approccio. sembra che ci dovrebbe essere una funzione che fa questo ... –

2

che sto cercando di fare la stessa cosa di me. Invece di costruire una serie di tutti i paesi, che ne dici di usare la regex per determinare il formato?

setlocale(LC_TIME, "us_US"); 

// returns 'mdy' 
$type1 = getDateFormat(); 

setlocale(LC_TIME, "fi_FI"); 

// returns 'dmy' 
$type2 = getDateFormat(); 

setlocale(LC_TIME, "hu_HU"); 

// returns 'ymd' 
$type3 = getDateFormat(); 

/** 
* @return string 
*/ 
function getDateFormat() 
{ 
    $patterns = array(
     '/11\D21\D(1999|99)/', 
     '/21\D11\D(1999|99)/', 
     '/(1999|99)\D11\D21/', 
    ); 
    $replacements = array('mdy', 'dmy', 'ymd'); 

    $date = new \DateTime(); 
    $date->setDate(1999, 11, 21); 

    return preg_replace($patterns, $replacements, strftime('%x', $date->getTimestamp())); 
} 
1
function getDateFormat($locale) 
{ 
    $formatter = new IntlDateFormatter($locale, IntlDateFormatter::SHORT, IntlDateFormatter::NONE); 
    if ($formatter === null) 
     throw new InvalidConfigException(intl_get_error_message()); 

    return $formatter->getPattern(); 
} 

Fai shure si installa intl.

+0

Nota, quella data sarà in formato ICU – verybadbug

+0

Per me questa è la migliore risposta - universale, breve e funzionante. Sebbene quei formati di terapia intensiva sembrano essere piuttosto brevi sulle possibilità. Avrei bisogno di qualcosa come IntlDateFormatter :: SHORT con anni a 4 cifre e primi 0 secondi. – userfuser

+0

Non l'ho estratto subito dal manuale (si dice '" Stile medio (12 gennaio 1952) "'), ma a quanto pare IntlDateFormatter :: MEDIUM è proprio quello di cui avevo bisogno (zeri iniziali, anno a 5 cifre) – userfuser

Problemi correlati