2012-01-11 50 views
9

Có một vấn đề rất đơn giản. Tôi có một định danh địa phương, en, en_US, cs_CZ hoặc bất cứ điều gì. Tôi chỉ cần có định dạng ngày giờ cho ngôn ngữ đó. Tôi biết tôi có thể dễ dàng định dạng bất kỳ dấu thời gian hoặc đối tượng ngày nào theo ngôn ngữ. Nhưng tôi chỉ cần biểu diễn chuỗi của định dạng ngày, giả sử cụm từ thông dụng. Có chức năng nào quản lý chức năng này không? Tôi đã không tìm thấy bất kỳ cho đến nay ...Lấy định dạng ngày theo ngôn ngữ trong PHP

Exapmle:

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

Tôi đồng ý với @dagon. và thiết lập PHP theo UTC sẽ làm cho nó dễ dàng hơn nhiều. – ThinkingMonkey

+1

@Dagon Tôi tin rằng bình luận của bạn chính xác hơn, bạn nên đặt nó như một câu trả lời. –

Trả lời

2

chuyển đổi từ nhận xét:

bạn sẽ phải tạo một mảng với danh sách các khả năng.

http://en.wikipedia.org/wiki/Date_format_by_country sẽ giúp ích.

đăng chức năng ở đâu đó khi hoàn thành, tôi chắc chắn rằng nó sẽ có ích cho những người khác

+0

đây là lời khuyên, nhưng không trả lời – verybadbug

+0

tôi đã được yêu cầu bật nhận xét để trả lời, và vì vậy tôi đã làm. –

0

Sử dụng strftime() kết hợp với setlocale(). Có vẻ như đó là những gì bạn đang tìm kiếm.

+0

Cảm ơn bạn đã trả lời, nhưng đó là cách ngược lại. Nếu không, tôi không theo ý tưởng của bạn. Bạn có thể viết một ví dụ ngắn không? –

+2

à, tôi nghĩ tôi đã hiểu rồi. 'strftime()' sẽ chuyển đổi thời gian và ngôn ngữ của đầu ra, nhưng đối với định dạng thực tế như "yyyy-mm-dd" ở Canada thay vì "dd/mm/yyyy" ở Albania, tôi tin rằng bạn sẽ phải sử dụng Dagon's tiếp cận. có vẻ như cần có một chức năng thực hiện điều này ... –

2

Tôi đang cố gắng làm điều tương tự. Thay vì xây dựng một mảng của tất cả các quốc gia, làm thế nào về việc sử dụng regex để xác định định dạng?

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

Make shure bạn cài đặt intl.

+0

Lưu ý, mẫu ngày tháng đó sẽ ở định dạng ICU – verybadbug

+0

Với tôi đây là câu trả lời hay nhất - phổ quát, ngắn gọn và hoạt động. Mặc dù các định dạng ICU đó dường như khá ngắn về khả năng. Tôi cần một cái gì đó như IntlDateFormatter :: SHORT với 4 chữ số năm và 0 hàng đầu. – userfuser

+0

Tôi đã không chọn nó từ hướng dẫn ngay lập tức (nó nói '" Medium style (Jan 12, 1952) "'), nhưng rõ ràng là IntlDateFormatter :: MEDIUM chỉ là những gì tôi cần (số 0 đứng đầu, năm chữ số) – userfuser

Các vấn đề liên quan