user2710234
user2710234

Reputation: 3225

Convert number to month name in PHP

I have this PHP code:

$monthNum = sprintf("%02s", $result["month"]);
$monthName = date("F", strtotime($monthNum));

echo $monthName;

But it's returning December rather than August.

$result["month"] is equal to 8, so the sprintf function is adding a 0 to make it 08.

Upvotes: 193

Views: 482132

Answers (22)

Dereckson
Dereckson

Reputation: 1411

IntlDateFormatter::format

To do the conversion in respect of a specific locale, you can use the IntlDateFormatter class:

function getMonthName ($locale, $monthNumber) {
    $formatter = new IntlDateFormatter($locale);
    $formatter->setPattern('MMMM');

    return $formatter->format(mktime(0, 0, 0, $monthNumber));
}

$monthName = getMonthName('fr_FR', 8); // août

This requires the intl extension. The class is available in PHP 5.3.0+.

Historical - before PHP 8.1.0

Before the IntlDateFormatter class, the strftime function was used. This function has been deprecated in PHP 8.1.0.

To do the conversion in respect of the current locale, you can use the strftime function:

setlocale(LC_TIME, 'fr_FR.UTF-8');                                              
$monthName = strftime('%B', mktime(0, 0, 0, $monthNumber));

date doesn't respect the locale, strftime does.

Upvotes: 29

Jorge Carvalho
Jorge Carvalho

Reputation: 79

My approach

$month = date('m');
$months_of_year = array(
    array('month' => '01', 'translation' => 'janeiro'),
    array('month' => '02', 'translation' => 'fevereiro'),
    array('month' => '03', 'translation' => 'março'),
    array('month' => '04', 'translation' => 'abril'),
    array('month' => '05', 'translation' => 'maio'),
    array('month' => '06', 'translation' => 'junho'),
    array('month' => '07', 'translation' => 'julho'),
    array('month' => '08', 'translation' => 'agosto'),
    array('month' => '09', 'translation' => 'setembro'),
    array('month' => '10', 'translation' => 'outubro'),
    array('month' => '11', 'translation' => 'novembro'),
    array('month' => '12', 'translation' => 'dezembro'),
);
$current_month = '';
foreach ($months_of_year as $key => $value) 
{
    if ($value['month'] == $month){
        $current_month = $value['translation'];  
        break;  
    }
}
echo("mes:" . $current_month);

Upvotes: -1

Brandonjgs
Brandonjgs

Reputation: 382

This respect the LC_TIME

$date = new DateTime('2022-04-05');
$mes = strftime('%B', $date->getTimestamp());

Upvotes: 0

bryanitur
bryanitur

Reputation: 121

If you have the month number, you can first create a date from it with a default date of 1st and default year of the current year, then extract the month name from the date created:

echo date("F", strtotime(date("Y") ."-". $i ."-01"))

This code assumes you have your month number stored in $i

Upvotes: 12

Kaushik shrimali
Kaushik shrimali

Reputation: 1228

You can do it in just one line:

DateTime::createFromFormat('!m', $salary->month)->format('F'); //April

Upvotes: 4

Geovany Quissanga
Geovany Quissanga

Reputation: 21

$days = ['', 'Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
$month = ( date('m') < 10 ) ? date('m')[1] : date('m');

That extracts the months.

Upvotes: 2

Avinash Raut
Avinash Raut

Reputation: 2103

A simple tricks here you can use strtotime() function workable as per your need, a convert number to month name.

1.If you want a result in Jan, Feb and Mar Then try below one with the 'M' as a parameter inside the date.

$month=5;
$nmonth = date('M',strtotime("01-".$month."-".date("Y")));
echo $nmonth;

Output : May

/2. You can try with the 'F' instead of 'M' to get the full month name as an output January February March etc.

$month=1;
$nmonth = date('M',strtotime("01-".$month."-".date("Y")));
echo $nmonth;

Output : January

Upvotes: 1

Nishad Up
Nishad Up

Reputation: 3615

There are many ways to print a month from the given number. Pick one suite for you.

1. date() function along with parameter 'F'

Code example:

$month_num = 10;
echo date("F", mktime(0, 0, 0, $month_num, 10)); //output: October

2. By creating php date object using createFromFormat()

Code Example

$dateObj   = DateTime::createFromFormat('!m', $monthNum);
echo "month name: ".$dateObj->format('F'); // Output: October

3. strtotime() function

echo date("F", strtotime('00-'.$monthNum.'-01')); // Output: October

4. mktime() function

echo date("F", mktime(null, null, null, $monthNum)); // Output: October

5. By using jdmonthname()

$jd=gregoriantojd($monthNum,10,2019);
echo jdmonthname($jd,0); // Output: Oct

Upvotes: 14

Vicky Salunkhe
Vicky Salunkhe

Reputation: 10975

This is how I did it

// sets Asia/Calcutta time zone
date_default_timezone_set("Asia/Calcutta");

//fetches current date and time
$date = date("Y-m-d H:i:s");

$dateArray = date_parse_from_format('Y/m/d', $date);
$month = DateTime::createFromFormat('!m', $dateArray['month'])->format('F');
$dateString = $dateArray['day'] . " " . $month  . " " . $dateArray['year'];

echo $dateString;

returns 30 June 2019

Upvotes: 0

imtaher
imtaher

Reputation: 438

This for all needs of date-time converting

 <?php
 $newDate = new DateTime('2019-03-27 03:41:41');
 echo $newDate->format('M d, Y, h:i:s a');
 ?>

Upvotes: 2

matthewpark319
matthewpark319

Reputation: 1263

$monthNum = 5;
$monthName = date("F", mktime(0, 0, 0, $monthNum, 10));

I found this on https://css-tricks.com/snippets/php/change-month-number-to-month-name/ and it worked perfectly.

Upvotes: 7

Cristo Rutazihana
Cristo Rutazihana

Reputation: 121

Am currently using the solution below to tackle the same issue:

//set locale, 
setlocale(LC_ALL,"US");

//set the date to be converted
$date = '2016-08-07';

//convert date to month name
$month_name =  ucfirst(strftime("%B", strtotime($date)));

echo $month_name;

To read more about set locale go to http://php.net/manual/en/function.setlocale.php

To learn more about strftime go to http://php.net/manual/en/function.strftime.php

Ucfirst() is used to capitalize the first letter in a string.

Upvotes: 2

Mr Heelis
Mr Heelis

Reputation: 2546

this is trivially easy, why are so many people making such bad suggestions? @Bora was the closest, but this is the most robust

/***
 * returns the month in words for a given month number
 */
date("F", strtotime(date("Y")."-".$month."-01"));

this is the way to do it

Upvotes: 2

zzapper
zzapper

Reputation: 5043

adapt as required

$m='08';
$months = array (1=>'Jan',2=>'Feb',3=>'Mar',4=>'Apr',5=>'May',6=>'Jun',7=>'Jul',8=>'Aug',9=>'Sep',10=>'Oct',11=>'Nov',12=>'Dec');
echo $months[(int)$m];

Upvotes: 10

Greg
Greg

Reputation: 21899

strtotime expects a standard date format, and passes back a timestamp.

You seem to be passing strtotime a single digit to output a date format from.

You should be using mktime which takes the date elements as parameters.

Your full code:

$monthNum = sprintf("%02s", $result["month"]);
$monthName = date("F", mktime(null, null, null, $monthNum));

echo $monthName;

However, the mktime function does not require a leading zero to the month number, so the first line is completely unnecessary, and $result["month"] can be passed straight into the function.

This can then all be combined into a single line, echoing the date inline.

Your refactored code:

echo date("F", mktime(null, null, null, $result["month"], 1));

...

Upvotes: 22

temuri
temuri

Reputation: 2807

Use:

$name = jdmonthname(gregoriantojd($monthNumber, 1, 1), CAL_MONTH_GREGORIAN_LONG);

Upvotes: -1

boomx09
boomx09

Reputation: 13

I think using cal_info() is the easiest way to convert from number to string.

$monthNum = sprintf("%02s", $result["month"]); //Returns `08`
$monthName = cal_info(0); //Returns Gregorian (Western) calendar array
$monthName = $monthName[months][$monthNum];

echo $monthName; //Returns "August"

See the docs for cal_info()

Upvotes: 0

Trent Renshaw
Trent Renshaw

Reputation: 522

If you just want an array of month names from the beginning of the year to the end e.g. to populate a drop-down select, I would just use the following;

for ($i = 0; $i < 12; ++$i) {
  $months[$m] = $m = date("F", strtotime("January +$i months"));
}

Upvotes: 10

mintedsky
mintedsky

Reputation: 1103

Use mktime():

<?php
 $monthNum = 5;
 $monthName = date("F", mktime(0, 0, 0, $monthNum, 10));
 echo $monthName; // Output: May
?>

See the PHP manual : http://php.net/mktime

Upvotes: 39

Amal Murali
Amal Murali

Reputation: 76646

The recommended way to do this:

Nowadays, you should really be using DateTime objects for any date/time math. This requires you to have a PHP version >= 5.2. As shown in Glavić's answer, you can use the following:

$monthNum  = 3;
$dateObj   = DateTime::createFromFormat('!m', $monthNum);
$monthName = $dateObj->format('F'); // March

The ! formatting character is used to reset everything to the Unix epoch. The m format character is the numeric representation of a month, with leading zeroes.

Alternative solution:

If you're using an older PHP version and can't upgrade at the moment, you could this solution. The second parameter of date() function accepts a timestamp, and you could use mktime() to create one, like so:

$monthNum  = 3;
$monthName = date('F', mktime(0, 0, 0, $monthNum, 10)); // March

If you want the 3-letter month name like Mar, change F to M. The list of all available formatting options can be found in the PHP manual documentation.

Upvotes: 431

Glavić
Glavić

Reputation: 43552

Just because everyone is using strtotime() and date() functions, I will show DateTime example:

$dt = DateTime::createFromFormat('!m', $result['month']);
echo $dt->format('F');

Upvotes: 44

Bora
Bora

Reputation: 10717

You need set fields with strtotime or mktime

echo date("F", strtotime('00-'.$result["month"].'-01'));

With mktime set only month. Try this one:

echo date("F", mktime(0, 0, 0, $result["month"], 1));

Upvotes: 2

Related Questions