Преобразовать число в название месяца в PHP

152

У меня есть этот код PHP:

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

echo $monthName;

Но это возвращение, Decemberа не August.

$result["month"]равно 8, поэтому sprintfфункция добавляет, 0чтобы сделать это 08.

user2710234
источник
6
Если вы не конвертируете это в полную дату (08-21-2013), или что-то похожее на дату, strtotimeне имеет понятия, что вы пытаетесь сделать. В качестве альтернативы просто используйте переключатель для чего-то вроде этого.
phpisuber01
извините - $ result ["month"] равен 8, потому что у меня есть SQL-запрос, который говорит, что выберите MONTH (дата / время) из таблицы ... поэтому в таблице
указан
1
Но strtotimeпонятия не имеет, что означает «8». strtotimeразбирает полные метки времени, такие как "2012-05-12 08:43:12". Что означает «8» в этом контексте?
deceze
почему не просто echo date( "F", time() );:? Например, echo date( "F", strtotime("2019-03-09") );будет выводиться «Март»
Роб Уоттс

Ответы:

357

Рекомендуемый способ сделать это:

В настоящее время вы действительно должны использовать объекты DateTime для любой даты / времени. Это требует, чтобы у вас была версия PHP> = 5.2. Как показано в ответе Главича , вы можете использовать следующее:

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

Символ !форматирования используется для сброса всего в эпоху Unix . Символ mформата - это числовое представление месяца с начальными нулями.

Альтернативное решение:

Если вы используете более старую версию PHP и не можете обновить ее в данный момент, вы можете воспользоваться этим решением. Второй параметр date()функции принимает временную метку, и вы можете использовать ее mktime()для создания, например, так:

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

Если вы хотите, чтобы трехбуквенное название месяца было похоже Mar, измените Fна M. Список всех доступных параметров форматирования можно найти в документации по PHP .

Амаль Мурали
источник
36
Это не учитывает локаль LC_TIME и всегда выводит название месяца на английском языке.
Дерексон,
2
Я никогда не видел это на SO - фатальная ошибка: вызов функции-члена format () для необъекта в Noone из 48 плюсов не имел этого?
Ярослав Штрейт
1
Почему вы говорите, что мы действительно должны использовать объекты DateTime для этого? Объекты DateTime полезны, но функция date () намного проще, поскольку имеет гораздо меньшие накладные расходы (с точки зрения как скорости, так и памяти), если все, что вы пытаетесь сделать, это что-то простое, как это.
orrd
4
@ orrd: Если разница в скорости между date () и DateTime окажется узким местом приложения, которое вы создаете, я бы сказал, что у вас есть большие проблемы, о которых нужно беспокоиться. Для реальных приложений, где вам неизбежно понадобится сделать что-то с датами, то наличие этого в объекте является преимуществом, так как он имеет более легкий для чтения API.
Амаль Мурали
1
@orrd: Кинда удивилась, просто предложив, что DateTime гарантирует снижение: P Так много для СУХОГО: artima.com/intv/dry.html
Амаль Мурали
42

Просто потому, что все используют функции strtotime () и date (), я покажу пример DateTime :

$dt = DateTime::createFromFormat('!m', $result['month']);
echo $dt->format('F');
Glavic
источник
Кроме того, вы можете использовать DateTime::createFromFormat('m|', $result['month']);для сброса только те поля, которые отсутствуют.
обнуляемость
Есть ли способ изменить язык с помощью этого решения?
Мишель Айрес
@MichelAyres: Нет. Вам придется использовать strftime()для этого.
Амаль Мурали
30

Используйте mktime():

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

Смотрите руководство по PHP: http://php.net/mktime

mintedsky
источник
Есть ли способ получить номер месяца, когда передается название месяца?
Ниша
@Nisha использовать параметр, "m"он вернет месяц в виде двухзначного числа в виде string. например, январь = 01, февраль = 02
Зак
18

strtotime ожидает стандартный формат даты и передает обратно метку времени.

Похоже, вы передаете strtotimeодну цифру для вывода формата даты.

Вы должны использовать тот, mktimeкоторый принимает элементы даты в качестве параметров.

Ваш полный код:

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

echo $monthName;

Однако функция mktime не требует нуля в начале номера месяца, поэтому первая строка совершенно не нужна и $result["month"]может быть передана непосредственно в функцию.

Затем все это можно объединить в одну строку, повторяя встроенную дату.

Ваш реорганизованный код:

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

...

Greg
источник
Странно date("F", mktime(null, null, null, 2));возвращается Marchвместо February.
Миша
4
Хорошо заметил, @Mischa. Если вы не установите день (5-й параметр), mktimeбудет использоваться текущий день. Сегодня 31-е. Что такое 31 февраля? :)
Грег
В вашем рефакторированном коде есть ошибка. 1не предоставляется как 5-й параметр для, mktimeно как 3-й параметр, к dateкоторому не приведет ожидаемый результат
Ejaz
18

Чтобы выполнить преобразование в отношении текущей локали, вы можете использовать strftimeфункцию:

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

dateне уважает язык, strftimeделает.

Dereckson
источник
Спасибо, работает хорошо! Тем не менее, мне пришлось использовать $monthName = utf8_encode(strftime('%B', mktime(0, 0, 0, $monthNumber)));для отображения акцентированных символов, как в 'Août'
Руби
2
@Roubi Поскольку utf8_encode задокументирован как «Кодирует строку ISO-8859-1 в UTF-8», это означает, что ваш û был ISO-8859-1. Если вы хотите везде использовать UTF-8 (а ваш код PHP не запускается по умолчанию в UTF-8), вы можете использовать LC_ALL вместо LC_TIME в setlocale.
Дерексон
6

Если вы просто хотите получить массив названий месяцев от начала года до конца, например, чтобы заполнить выпадающий список, я бы просто использовал следующее;

for ($i = 0; $i < 12; ++$i) {
  $months[$m] = $m = date("F", strtotime("January +$i months"));
}
Трент Реншоу
источник
6

Есть много способов напечатать месяц с заданного номера. Выберите один люкс для вас.

1. функция date () вместе с параметром 'F'

Пример кода:

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

2. Создавая объект php date с помощью createFromFormat ()

Пример кода

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

3. функция strtotime ()

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

4. функция mktime ()

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

5. Используя jdmonthname ()

$jd=gregoriantojd($monthNum,10,2019);
echo jdmonthname($jd,0); // Output: Oct
Нишад Ап
источник
4

адаптироваться по мере необходимости

$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];
zzapper
источник
1
Просто и точно, без лишних преобразований дат.
Мартти
4

Если у вас есть номер месяца, вы можете сначала создать из него дату с датой по умолчанию 1-й и годом по умолчанию текущего года, а затем извлечь имя месяца из созданной даты:

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

Этот код предполагает, что ваш месяц хранится в $ i

Надеюсь, это поможет кому-то

Брайан Итур
источник
2

это тривиально легко, почему так много людей делают такие плохие предложения? @ Бора был ближайшим, но это самый надежный

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

это способ сделать это

Мистер Хилис
источник
2

В настоящее время использую решение ниже для решения той же проблемы:

//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;

Чтобы узнать больше о настройке локали, перейдите по ссылке http://php.net/manual/en/function.setlocale.php

Чтобы узнать больше о strftime, зайдите на http://php.net/manual/en/function.strftime.php

Ucfirst() используется для заглавных букв первой буквы в строке.

Кристо Рутазихана
источник
для совместимости с utf8 попробуйте: utf8_encode (ucfirst (strftime ("% B", strtotime ($ date))));
Мимуни,
1
@Mimouni Это не нужно, так как функция utf8_encode преобразует строки ISO-8859-1 в UTF-8, но через LC_ALL код может быть задан для вывода UTF-8, например, если вы используете en_US.UTF-8 вместо НАС.
Дерексон
2

Только одна строка

DateTime::createFromFormat('!m', $salary->month)->format('F'); //April
Каушик Шримали
источник
1

Вам нужно установить поля с strtotimeилиmktime

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

С mktimeсет только месяц. Попробуй это:

echo date("F", mktime(0, 0, 0, $result["month"], 1));
бора
источник
1
date("F", strtotime($result["month"]))

используйте приведенный выше код

Висах Б Суджатан
источник
1

Это для всех нужд преобразования даты и времени

 <?php
 $newDate = new DateTime('2019-03-27 03:41:41');
 echo $newDate->format('M d, Y, h:i:s a');
 ?>
imtaher
источник
1
<?php
$month =1;
$convert =DateTime::createFromFormat('!m', $month);
echo $convert->format('F');
?>
Манджит Кумар Най
источник
0

Я думаю, что использование cal_info () - это самый простой способ преобразовать число в строку.

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

echo $monthName; //Returns "August"

Смотрите документы для cal_info ()

boomx09
источник
0

Я знаю, что этот вопрос задавали некоторое время назад, но я подумал, что все, кто ищет этот ответ, вероятно, просто пытались избежать выписывания целых операторов if / else, поэтому я написал их для вас, чтобы вы могли копировать / вставлять. Единственное предостережение, связанное с этой функцией, заключается в том, что она соответствует фактическому номеру месяца, а не индексируемому 0, поэтому январь = 1, а не 0.

function getMonthString($m){
    if($m==1){
        return "January";
    }else if($m==2){
        return "February";
    }else if($m==3){
        return "March";
    }else if($m==4){
        return "April";
    }else if($m==5){
        return "May";
    }else if($m==6){
        return "June";
    }else if($m==7){
        return "July";
    }else if($m==8){
        return "August";
    }else if($m==9){
        return "September";
    }else if($m==10){
        return "October";
    }else if($m==11){
        return "November";
    }else if($m==12){
        return "December";
    }
}
Чумовая черепаха
источник
4
Почему вы не использовали переключатель / чехол?
Artjom B.
Думаю, я мог бы сделать это, личный выбор в основном, если бы легче было читать, а если бы у вас было всего 12 опций, любые различия в скорости были бы незначительными.
Чумовая Черепаха
это не работает, если у вас есть многоязычный веб-сайт
Crustamet
Нет, но вы могли бы заменить возвращаемые строки функциями i18n, которые возвращают месяц на выбранном вами языке
Freaky Turtle
0

Чтобы получить название месяца, указав номер месяца

$ month_number = 5;

$ monthName = date ('F', mktime (0, 0, 0, $ month_number, 10));

Где «F» вернет вам название месяца, например. 'Май'

Бижендра Саху
источник
0

Вот как я это сделал

// 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;

возвращается 30 June 2019

Вики Салунхе
источник
0

Простыми хитростями здесь вы можете использовать функцию strtotime (), работающую в соответствии с вашими потребностями, конвертировать число в название месяца.

1. Если вы хотите получить результат в январе, феврале и марте, то попробуйте ниже одного с «М» в качестве параметра внутри даты.

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

Выход: май

/ 2. Вы можете попробовать с «F» вместо «M», чтобы получить полное название месяца в качестве вывода январь февраль март и т. Д.

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

Выход: январь

Авинаш Раут
источник
0
$days = ['', 'Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
$month = ( date('m') < 10 ) ? date('m')[1] : date('m');

Это извлекает месяцы.

Geovany Quissanga
источник
-3

Используйте встроенную функцию, такую ​​как jdmonthname():

echo jdmonthname($monthNum, CAL_MONTH_GREGORIAN_LONG);
Тонин Болзан
источник
jdmonthname(3, CAL_MONTH_GREGORIAN_LONG);возвращаетсяNovember
Онимуша
jdmonthname () ожидает юлианский день, который является инкрементным числом дней, используемых в астрономии. День 0 был 01 января 4713 г. до н.э., День 1 был 02 января 4713 г. до н.э. и т. Д. 20 октября 2014 года (как григорианская дата) - юлианский день 2456951 (который как юлианская дата - 7 октября 2014 года). Как ни странно, PHP неправильно обрабатывает 0 юлианских дней: echo jdtojulian (0). "<br/>"; echo jdtojulian (1). "<br/>"; echo jdtojulian (2). "<br/>"; Возвращает: 0/0/0 1/2 / -4713 1/3 / -4713
Джордж Лэнгли
-3

Вы можете просто использовать функцию monthname () в SQL.

ВЫБЕРИТЕ имя месяца (date_column) из группы таблиц по названию месяца (date_column)

Сони Кришна Свами
источник
1.) PHP был задан, а не SQL 2.) Ваш ответ, похоже, специфический для MySQL, а не общий SQL.
Март