11

I need to display to user a list of localized day names (like 'Monday', 'Tuesday', ...) in a form. I know ho to get day name of any date. But is there a particular and fail-proof way to get all day names in an array.

Edit: I could add names of days to my translation file but that is hard to maintain.

Cemal Eker
  • 1,266
  • 1
  • 9
  • 24
  • Day names? Do you mean like `Monday, Tuesday, Wednesday... etc?` – Pangolin Oct 14 '11 at 09:15
  • 2
    Why not define them yourself? It's usually the best way to go because asking `date()` depends on locale settings that are notoriously unreliable. – Pekka Oct 14 '11 at 09:17
  • 2
    *(reference)* http://www.php.net/manual/en/intldateformatter.format.php – Gordon Oct 14 '11 at 09:22
  • *(reference)* http://www.php.net/manual/en/function.strftime.php – Gordon Oct 14 '11 at 09:23
  • Any localization solution needs to be considered within your overall localization strategy. Vascowhite's solution is not necessarily locale specific but it viable as the basis for a number of different localization solutions. See my comment, and note his adjustment. If you use the numeric index for the date, that will allow you to get a predictable string which you can then use as the key to return the localized string. – gview Oct 14 '11 at 09:36
  • http://stackoverflow.com/a/3729069/1481489 and http://stackoverflow.com/questions/3729038/how-do-i-get-locale-day-and-month#comment30318102_3729069 – zamnuts Dec 01 '13 at 20:11

7 Answers7

33
$date = '2011/10/14'; 
$day = date('l', strtotime($date));
echo $day;
Abbas
  • 14,186
  • 6
  • 41
  • 72
15

Using strftime() in combination with setlocale() is an option.

However you should be aware that on threaded php installs, setlocale() can behave unexpected, since locale information is maintained per process, not per thread. Therefor it is important to call setlocale() every time before each call to strftime() to guarantee it uses the correct locale.

Also, for Windows systems, you need to use somewhat unusual strings for the $locale parameter for setlocale().

See the docs for more information on both of these issues.

Something like this should work:

// 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 );
Decent Dabbler
  • 22,532
  • 8
  • 74
  • 106
  • Please note, that localized weekdays are returned in `windows-1250` rather than `utf-8`. Additional encoding conversion e.g. via `iconv` may be needed. Tested on Win64 PHP 7.0. – lubosdz Jul 19 '19 at 20:52
5

The "usual" way is to start with a given last day and count up a day on each iteration.

for ($i = 0; $i < 7; $i++) {
  $weekDayNames[] = strftime("%a", strtotime("last sunday +$i day"));
}
yckart
  • 32,460
  • 9
  • 122
  • 129
4
$dayNames = array(
    'Sunday',
    'Monday', 
    'Tuesday', 
    'Wednesday', 
    'Thursday', 
    'Friday', 
    'Saturday', 
 );

Is pretty fail-proof :)

On a more serious note, the likes of PHPBB do this by defining localization files and hard coding for different languages. It's really the only way to do this reliably.

I would recommend downloading something like that and looking at the code to see how its done.

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

vascowhite
  • 18,120
  • 9
  • 61
  • 77
  • 2
    It's hard to maintain for all languages and that makes me a sad panda. – Cemal Eker Oct 14 '11 at 09:20
  • 1
    If you are going to do this, it should be 'Sunday', ... 'Saturday' to coincide with the return from date('w') where Sunday is the 0th element. – gview Oct 14 '11 at 09:26
1
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);

Obviously can be optimised by not calling time() 7 times etc but that's the gist. It gives you the right language for the locale and keeps Sun-Sat order of the array in tact.

Ben Swinburne
  • 25,669
  • 10
  • 69
  • 108
0

I know its been a long time, but what about:

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

from how to create array of a week days name in php

Community
  • 1
  • 1
d0001
  • 2,162
  • 3
  • 20
  • 46
-2

This code will work pretty well:-

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

Now for example you wants to get the any day from array:-

echo $dayNames[1]; //Output:- Monday
Dinesh Rawat
  • 970
  • 10
  • 32