2012-01-05 26 views
45

Tôi có một đối tượng DateTime mà tôi đang formating quađối tượng DateTime Formatting, tôn trọng Locale :: getDefault()

$mytime->format("D d.m.Y") 

nào mang lại cho tôi chính xác định dạng tôi cần:

Tue 5.3 .2012

Điểm mất chỉ là ngôn ngữ chính xác. Tôi cần bản dịch tiếng Đức của Tue (Tuesday), là Die (Dienstag).

này mang lại cho tôi những thiết

Locale::getDefault() 

locale đúng Nhưng tôi không biết làm thế nào để nói với DateTime::format để sử dụng nó.

không có phải là một cách để làm điều gì đó như:

$mytime->format("D d.m.Y", \Locale::getDefault()); 
+0

cẩn thận: strftime ("% a% e.% L.% Y", \ Locale :: getDefault()) không hoạt động (ít nhất là ở đây trên thiết lập của tôi), vì getDefault() trả về "de" thay vì "de_DE" ... – stoefln

+1

Tham số thứ hai của strftime phải là dấu thời gian, không phải là ngôn ngữ. – Jonathan

+0

Ồ, xin lỗi. Hoàn toàn rõ ràng rằng điều này không hoạt động. Những gì tôi thực sự muốn nói là setlocale (LC_TIME, \ Locale :: getDefault()) không hoạt động (trong ứng dụng symfony2 của tôi) – stoefln

Trả lời

48

Đó là bởi vì format không chú ý đến miền địa phương. Thay vào đó, bạn nên sử dụng strftime.

Ví dụ:

setlocale(LC_TIME, "de_DE"); //only necessary if the locale isn't already set 
$formatted_time = strftime("%a %e.%l.%Y", $mytime->getTimestamp()) 
+8

Hành vi này được ghi chú trong tài liệu php trên [DateTime :: format] (http: // www.php.net/manual/en/datetime.format.php): * 'Phương thức này không sử dụng ngôn ngữ. Tất cả đầu ra là tiếng Anh.' * – rdlowrey

+20

strftime() không hoạt động với các ngày trước năm 1970, Date_time :: format() không hoạt động với các ngôn ngữ ... có bất kỳ thứ gì hoạt động với cả hai? –

+1

@Jay K: Bạn luôn có thể mở rộng Lớp DateTime gốc của PHP để thêm nội địa hóa vào nó. – Duroth

81

Bạn có thể sử dụng phần mở rộng Intl để định dạng ngày tháng. Nó sẽ định dạng ngày/giờ theo ngôn ngữ đã chọn, hoặc bạn có thể ghi đè lên đó với IntlDateFormatter::setPattern().

Ví dụ nhanh về cách sử dụng mẫu tùy chỉnh, cho định dạng đầu ra mong muốn của bạn, có thể giống như thế.

$dt = new DateTime; 

$formatter = new IntlDateFormatter('de_DE', IntlDateFormatter::SHORT, IntlDateFormatter::SHORT); 
$formatter->setPattern('E d.M.yyyy'); 

echo $formatter->format($dt); 

Đầu ra nào sau đây (cho ngày hôm nay, ít nhất).

Di. 4.6.2013


Sửa: Ahh boo! Đã trả lời một câu hỏi cổ đại vì một số nhận xét đã làm nổi bật danh sách đó! Ít nhất tùy chọn Intl được đề cập ngay bây giờ.

+0

thật tuyệt khi bạn trả lời một câu hỏi cổ, bởi vì câu hỏi này bật lên ở đầu kết quả tìm kiếm của google và được sử dụng để chỉ cung cấp thông tin lỗi thời. –

+0

Ngoài ra, bạn nhận được huy hiệu "Necromancer" khi bạn (thành công) trả lời một câu hỏi cũ. – aesede

+0

Và nó sẽ được cập nhật là câu trả lời đúng – Celoain

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