2012-01-11 12 views
9

Istnieje bardzo prosty problem. Mam identyfikator locale, en, en_US, cs_CZ lub cokolwiek innego. Potrzebuję tylko formatu daty i czasu dla tych ustawień narodowych. Wiem, że mogę łatwo sformatować dowolny datownik lub obiekt daty zgodnie z ustawieniami regionalnymi. Ale potrzebuję tylko ciągu znaków formatu daty, powiedzmy wyrażenie regularne. Czy istnieje jakaś funkcja zarządzająca tą funkcjonalnością? Nie znalazłem żadnej pory ...Pobierz format daty zgodnie z ustawieniami narodowymi w PHP

Exapmle:

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

Zgadzam się z @dagon. ustawienie PHP na UTC znacznie ułatwi. – ThinkingMonkey

+1

@Dagon Uważam, że twój komentarz jest bardziej dokładny, powinieneś umieścić go jako odpowiedź. –

Odpowiedz

2

przekształcony z komentarzem:

trzeba będzie zbudować tablicę z listy możliwości.

http://en.wikipedia.org/wiki/Date_format_by_country powinien pomóc.

dodawać funkcję gdzieś kiedy zrobić, jestem pewien, że się przyda dla innych

+0

to jest rada, ale nie odpowiada – verybadbug

+0

. Zostałem poproszony o włączenie komentarza, aby odpowiedzieć, i tak zrobiłem. –

0

Korzystając strftime() w połączeniu z setlocale(). Wygląda na to, że tego właśnie szukasz.

+0

Dzięki za odpowiedź, ale jest odwrotnie. Jeśli nie, nie podążam za twoim pomysłem. Czy mógłbyś napisać krótki przykład? –

+2

ah, myślę, że teraz rozumiem. 'strftime()' skonwertuje czas i język wyjścia, ale dla faktycznego formatu jak "yyyy-mm-dd" w Kanadzie w przeciwieństwie do "dd/mm/rrrr" w Albanii, uważam, że będziesz musiał użyć Dagona podejście. wydaje się, że powinna istnieć funkcja, która to robi ... –

2

Staram się robić to samo siebie. Zamiast budować tablicę wszystkich krajów, a może użyć formatu regex do określenia formatu?

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(); 
} 

Producent Shure zainstalowaniu intl.

+0

Pamiętaj, że ten wzór daty będzie w formacie ICU – verybadbug

+0

Dla mnie jest to najlepsza odpowiedź - uniwersalna, krótka i działająca. Chociaż te formaty ICU wydają się dość krótkie. Potrzebowałbym czegoś takiego jak IntlDateFormatter :: SHORT z 4-cyfrowymi latami i wiodącymi 0. – userfuser

+0

Nie odebrałem tego od razu z podręcznika (brzmi to "Średni styl (12 sty, 1952)"), ale najwyraźniej IntlDateFormatter :: MEDIUM jest tym, czego potrzebowałem (wiodące zera, 5-cyfrowy rok) – userfuser