Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Retrieving Day Names in PHP

Tags:

date

php

locale

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.

like image 967
Cemal Eker Avatar asked Oct 14 '11 09:10

Cemal Eker


People also ask

How get the day name from a date in PHP?

$dayname = date('D', strtotime($longdate));

How do I find my day name by date?

The DAY function takes just one argument, the date from which you want to extract the day. In the example, the formula is: = DAY ( B5 ) B5 contains a date value for January 5, 2016. The DAY function returns the number 5 representing the day...

What does date () do in PHP?

Specifies the format of the outputted date string. The following characters can be used: d - The day of the month (from 01 to 31)

How can I get 30 Day date in PHP?

php $next_due_date = date('y-m-d',strtotime('+30 days',strtotime($userRow3["due_date"]))) ; ?>


2 Answers

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 );
like image 121
Decent Dabbler Avatar answered Oct 04 '22 17:10

Decent Dabbler


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"));
}
like image 39
yckart Avatar answered Oct 04 '22 15:10

yckart