2011-10-14 40 views
10

Tôi cần hiển thị cho người dùng danh sách tên ngày được địa phương hóa (như 'Thứ Hai', 'Thứ Ba', ...) trong một biểu mẫu. Tôi biết ho để có được tên ngày của bất kỳ ngày nào. Nhưng có một cách cụ thể và thất bại để có được tất cả các tên ngày trong một mảng.Lấy Tên Ngày trong PHP

Chỉnh sửa: Tôi có thể thêm tên ngày vào tệp dịch của mình nhưng khó duy trì.

+0

Tên ngày? Ý của bạn có phải là 'Thứ Hai, Thứ Ba, Thứ Tư ... vv?' – LouwHopley

+2

Tại sao không tự định nghĩa chúng? Nó thường là cách tốt nhất để đi vì yêu cầu 'date()' phụ thuộc vào các thiết lập miền địa phương nổi tiếng không đáng tin cậy. –

+2

* (tham khảo) * http://www.php.net/manual/en/intldateformatter.format.php – Gordon

Trả lời

13

Sử dụng strftime() kết hợp với setlocale() là một tùy chọn.

Tuy nhiên, bạn nên lưu ý rằng khi cài đặt php luồng, setlocale() có thể hoạt động không mong muốn vì thông tin ngôn ngữ được duy trì cho mỗi quy trình chứ không phải trên mỗi luồng. Do đó, điều quan trọng là gọi setlocale() mỗi lần trước mỗi cuộc gọi đến strftime() để đảm bảo nó sử dụng đúng ngôn ngữ.

Ngoài ra, đối với hệ thống Windows, bạn cần phải sử dụng các chuỗi hơi khác thường cho tham số $locale cho setlocale().

Xem tài liệu để biết thêm thông tin về cả hai vấn đề này.

Something như thế này nên làm việc:

// define the locales for setlocale() for which we need the daynames 
$locales = array(
    'en_EN', 
    'de_DE', 
    'nl_NL' 
    // etc... 
); 

// be aware that setlocale() needs different values on Windows machines 
// see the docs on setlocale() for more information 
$locales = array(
    'english', 
    'german', 
    'dutch' 
    // etc... 
); 

// let's remember the current local setting 
$oldLocale = setlocale(LC_TIME, '0'); 

// initialize out result array 
$localizedWeekdays = array(); 

// loop each locale 
foreach($locales as $locale) 
{ 
    // create sub result array for this locale 
    $localizedWeekdays[ $locale ] = array(); 

    // 7 days in a week 
    for($i = 0; $i < 7; $i++) 
    { 
     // set the locale on each iteration again 
     setlocale(LC_TIME, $locale); 

     // combine strftime() with the nifty strtotime() 
     $localizedWeekdays[ $locale ][] = strftime('%A', strtotime('next Monday +' . $i . ' days')); 

     // reset the locale for other threads, as a courtesy 
     setlocale(LC_TIME, $oldLocale); 
    } 
} 

// there is your result in a multi-dimensional array 
var_dump($localizedWeekdays); 
3
$dayNames = array(
    'Sunday', 
    'Monday', 
    'Tuesday', 
    'Wednesday', 
    'Thursday', 
    'Friday', 
    'Saturday', 
); 

là khá thất bại chống :)

Trên một lưu ý nghiêm trọng hơn, những cầu thủ như PHPBB làm điều này bằng cách định nghĩa các file nội địa hóa và mã hóa cứng cho các ngôn ngữ khác nhau. Đó thực sự là cách duy nhất để làm điều này một cách đáng tin cậy.

Tôi khuyên bạn nên tải xuống nội dung như thế và xem mã để xem cách thực hiện.

http://www.phpbb.com/downloads/olympus.php

+2

Rất khó để duy trì tất cả các ngôn ngữ và điều đó khiến tôi trở thành một chú gấu trúc buồn. –

+1

-1 OP được yêu cầu cho các tên được bản địa hóa. –

+3

Chúng được bản địa hóa cho tôi :) – vascowhite

32
$date = '2011/10/14'; 
$day = date('l', strtotime($date)); 
echo $day; 
+0

Cảm ơn bạn đã trả lời tốt và đơn giản của bạn +1 –

+0

Đó là đột nhiên không làm việc sau khi làm việc và tôi ngừng apache! Hiện tại, nó trả về số thay vì tên ngày ... – KeepMove

0
setlocale(LC_TIME, 'de_DE'); 

$today = (86400 * (date("N"))); 

for($i = 0; $i < 7; $i++) { 
    $days[] = strftime('%A', time() - $today + ($i*86400)); 
} 

print_r($days); 

Rõ ràng có thể được tối ưu hóa bằng cách không gọi thời gian() 7 lần vv nhưng đó là ý chính. Nó cung cấp cho bạn ngôn ngữ phù hợp cho ngôn ngữ và giữ cho thứ tự Sun-Sat của mảng không đổi.

0

tôi biết được một thời gian dài của nó, nhưng những gì về:

$timestamp = strtotime('next Sunday'); 
$days = array(); 
for ($i = 0; $i < 7; $i++) { 
$days[] = strftime('%A', $timestamp); 
$timestamp = strtotime('+1 day', $timestamp); 
} 

từ how to create array of a week days name in php

+0

Tôi không thấy bất kỳ sự khác biệt nào giữa giải pháp này và giải pháp được chấp thuận. –

-2

Mã này sẽ làm việc khá tốt: -

$dayNames = array(
    0=>'Sunday', 
    1=>'Monday', 
    2=>'Tuesday', 
    3=>'Wednesday', 
    4=>'Thursday', 
    5=>'Friday', 
    6=>'Saturday', 
); 

Bây giờ ví dụ bạn muốn để có được bất kỳ ngày nào từ mảng: -

echo $dayNames[1]; //Output:- Monday 
2

Cách "bình thường" là bắt đầu với một last day đưa ra và đếm lên một ngày trên mỗi lần lặp.

for ($i = 0; $i < 7; $i++) { 
    $weekDayNames[] = strftime("%a", strtotime("last sunday +$i day")); 
} 
Các vấn đề liên quan