Перетворити число в ім'я місяця в PHP


152

У мене є цей PHP-код:

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

echo $monthName;

Але це Decemberшвидше повернення August.

$result["month"]дорівнює 8, тому sprintfфункція додає а, 0щоб зробити його 08.


6
Якщо ви не перетворите це на повну дату (21.08.2013) або щось, що дуже нагадує дату strtotime, поняття не має, що ви намагаєтеся зробити. Крім того, просто використовуйте перемикач для чогось подібного.
phpisuber01

вибачте - $ результат ["місяця"] становить 8, тому що у мене є SQL-запит, який говорить, що виберіть MONTH (час дати) з таблиці ... тож у таблиці його повний формат дати
user2710234

1
Але strtotimeпоняття не має, що означає "8". strtotimeрозбирає повні часові позначки на кшталт "2012-05-12 08:43:12". Що означає "8" у цьому контексті?
деге

чому не просто: 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

Якщо ви хочете, щоб 3-літерне ім'я місяця подобалося Mar, змініть Fна M. Перелік усіх доступних опцій форматування можна знайти в документації по керівництву PHP .


36
Це не стосується мови LC_TIME і завжди виводить назву місяця англійською мовою.
Дерексон

2
Я ніколи не бачив цього на SO - Фатальна помилка: Виклик формату функції члена () для не-об’єкта в Ніхто з 48 плюсів цього не мав?
Ярослав Штрейт

1
Чому ви кажете, що ми "повинні насправді" використовувати для цього об'єкти DateTime? Об'єкти DateTime корисні, але функція date () набагато простіша, оскільки має набагато менші накладні витрати (з точки зору швидкості та пам'яті), якщо все, що ви намагаєтеся зробити, - це щось таке просте, як це.
orrd

4
@orrd: Якщо різниця в швидкості між датою () та DateTime виявиться вузьким місцем програми, яку ви будуєте, я б сказав, що у вас виникають більші проблеми. Для реальних додатків, коли вам неминуче потрібно буде робити інші речі з датами, то наявність його в об'єкті є вищим, оскільки це простіший для читання API.
Амаль Муралі

1
@orrd: Ніби не здивувавшись лише тому, що DateTime гарантує знижку: P Стільки для DRY: artima.com/intv/dry.html
Amal Murali

42

Просто тому, що всі використовують функції strtotime () та date (), я покажу DateTime приклад :

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

Крім того, ви можете 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


Чи є спосіб отримати номер місяця, коли ім'я місяця буде передано?
Ніша

@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));

...


Дивно 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але.


Дякую, добре працюю! Однак мені довелося використовувати $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 у встановленому масштабі.
Дерексон

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 за допомогою 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];

1
Простий і точний, без зайвих перетворень дати.
марті

4

Якщо у вас є номер місяця, ви можете спершу створити з нього дату із типовою датою 1-го та типовим роком поточного року, а потім вилучити назву місяця з дати, створеної:

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

Цей код передбачає, що ваш номер місяця зберігається в $ i

Сподіваюся, що це комусь допоможе



2

це банально просто, чому так багато людей роблять такі погані пропозиції? @Bora був найближчим, але це найнадійніший

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

Щоб дізнатись більше про стрімкінг, перейдіть на сторінку http://php.net/manual/en/function.strWeather.php

Ucfirst() використовується для використання великих літер у рядку.


для сумісності з utf8 спробуйте: utf8_encode (ucfirst (строковий час ("% B", strtotime ($ дата))));
Мімуні

1
@Mimouni Це не потрібно, оскільки функція utf8_encode перетворює рядки ISO-8859-1 в UTF-8, але через LC_ALL код можна доручити виводити UTF-8, наприклад, якщо ви використовуєте en_US.UTF-8 замість НАС.
Дерексон


1

Вам потрібно встановити поля з strtotimeабоmktime

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

З mktimeвстановленим лише місяцем. Спробуйте це:

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


1

Це для всіх потреб перетворення дат і часу

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


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 ()



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 = дата ('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. Якщо ви хочете отримати результат у січні, лютому та березні, тоді спробуйте нижче одного з параметром 'M' як параметр всередині дати.

$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');

Це витягує місяці.


-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.

SELECT ім'я місяця (дата_колонка) з групи таблиці за назвою місяця (дата_колонка)


1.) Запросили PHP, а не SQL 2.) Здається, ваша відповідь є специфікою MySQL, а не загальним SQL.
марті
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.