Konwertuj liczbę na nazwę miesiąca w PHP

152

Mam taki kod PHP:

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

echo $monthName;

Ale Decemberraczej wraca niż August.

$result["month"]jest równe 8, więc sprintffunkcja dodaje a, 0aby to zrobić 08.

user2710234
źródło
6
Chyba że przekonwertujesz to na pełną datę (21.08.2013) lub coś, co bardzo przypominałoby datę, strtotimenie ma pojęcia, co próbujesz zrobić. Alternatywnie po prostu użyj przełącznika do czegoś takiego.
phpisuber01
przepraszam - wynik $ ["miesiąc"] to 8, ponieważ mam zapytanie SQL, które mówi, że wybierz MIESIĄC (datę i godzinę) z tabeli ... więc w tabeli jest pełny format daty
user2710234
1
Ale strtotimenie ma pojęcia, co oznacza „8”. strtotimeanalizuje pełne sygnatury czasowe, takie jak „2012-05-12 08:43:12”. Co w tym kontekście oznacza „8”?
deceze
dlaczego nie tylko echo date( "F", time() );:? Na przykład echo date( "F", strtotime("2019-03-09") );wyświetli „Marzec”
Rob Watts

Odpowiedzi:

357

Zalecany sposób, aby to zrobić:

W dzisiejszych czasach naprawdę powinieneś używać obiektów DateTime do dowolnej matematyki związanej z datą / godziną. Wymaga to wersji PHP> = 5.2. Jak pokazano w odpowiedzi Glavicia , możesz użyć:

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

Znak !formatujący służy do resetowania wszystkiego do epoki Uniksa . Znak mformatu to liczbowa reprezentacja miesiąca z zerami na początku.

Alternatywne rozwiązanie:

Jeśli używasz starszej wersji PHP i nie możesz w tej chwili zaktualizować, możesz skorzystać z tego rozwiązania. Drugi parametr date()funkcji akceptuje znacznik czasu i możesz go użyć, mktime()aby go utworzyć, na przykład:

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

Jeśli chcesz mieć 3-literową nazwę miesiąca Mar, zmień Fna M. Listę wszystkich dostępnych opcji formatowania można znaleźć w dokumentacji podręcznika PHP .

Amal Murali
źródło
36
To nie respektuje ustawień regionalnych LC_TIME i zawsze wyświetla nazwę miesiąca w języku angielskim.
Dereckson
2
Nigdy nie widziałem tego na SO - Błąd krytyczny: wywołanie funkcji składowej format () na obiekcie niebędącym obiektem w Noone z 48 plusów nie miało tego?
Jaroslav Štreit
1
Dlaczego mówisz, że „powinniśmy” używać do tego obiektów DateTime? Obiekty DateTime są przydatne, ale funkcja date () jest znacznie prostsza, ponieważ ma znacznie mniejszy narzut (zarówno pod względem szybkości, jak i pamięci), jeśli wszystko, co próbujesz zrobić, to coś prostego.
orrd
4
@orrd: Jeśli różnica szybkości między date () a DateTime okaże się wąskim gardłem aplikacji, którą tworzysz, powiedziałbym, że masz większe problemy, o które musisz się martwić. W przypadku rzeczywistych aplikacji, w których nieuchronnie będziesz musiał zrobić inne rzeczy z datami, posiadanie go w obiekcie jest lepszym rozwiązaniem, ponieważ ma łatwiejszy do odczytania interfejs API.
Amal Murali,
1
@orrd: Trochę zaskoczony samą sugestią, że DateTime uzasadnia negatywną opinię: P Tyle o DRY: artima.com/intv/dry.html
Amal Murali
42

Tylko dlatego, że wszyscy używają funkcji strtotime () i date (), pokażę przykład DateTime :

$dt = DateTime::createFromFormat('!m', $result['month']);
echo $dt->format('F');
Glavić
źródło
Alternatywnie możesz użyć DateTime::createFromFormat('m|', $result['month']);do resetowania tylko brakujących pól.
nieważność
Czy jest sposób na zmianę języka za pomocą tego rozwiązania?
Michel Ayres
@MichelAyres: Nie. Będziesz musiał do tego użyć strftime().
Amal Murali
30

Zastosowanie mktime():

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

Zobacz podręcznik PHP: http://php.net/mktime

mintedsky
źródło
Czy istnieje sposób, aby uzyskać numer miesiąca, w którym minie nazwa miesiąca?
Nisha
@Nisha use parametr "m"zwróci miesiąc jako dwucyfrową liczbę jako a string. np. styczeń = 01, luty = 02
Zac,
18

strtotime oczekuje standardowego formatu daty i przekazuje znacznik czasu.

Wydaje się, że przekazujesz strtotimejedną cyfrę, z której ma zostać wyprowadzony format daty.

Powinieneś używać tego, mktimektóry przyjmuje elementy daty jako parametry.

Twój pełny kod:

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

echo $monthName;

Jednak funkcja mktime nie wymaga początkowego zera do numeru miesiąca, więc pierwsza linia jest całkowicie niepotrzebna i $result["month"] można ją przekazać bezpośrednio do funkcji.

Następnie można to wszystko połączyć w jeden wiersz, odzwierciedlając datę w wierszu.

Twój refaktoryzowany kod:

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

...

Greg
źródło
Dziwnie date("F", mktime(null, null, null, 2));wraca Marchzamiast February.
Mischa
4
Dobrze zauważone, @Mischa. Jeśli nie ustawisz dnia (piąty parametr), mktimeużyje dnia bieżącego. Dzisiaj jest 31. Jaki jest 31 lutego? :)
Greg
W Twoim refaktoryzowanym kodzie jest błąd. 1nie jest podawany jako piąty parametr, mktimeale jako trzeci parametr, datektóry nie przyniósłby oczekiwanych rezultatów
Ejaz.
18

Aby dokonać konwersji w odniesieniu do aktualnych ustawień regionalnych, możesz użyć strftimefunkcji:

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

datenie szanuje regionu, strftimetak.

Dereckson
źródło
Dzięki, fajna praca! Musiałem jednak użyć $monthName = utf8_encode(strftime('%B', mktime(0, 0, 0, $monthNumber)));, aby wyświetlić zaakcentowane znaki, jak w „Août”
Roubi
2
@Roubi Ponieważ utf8_encode jest udokumentowane jako „Koduje ciąg znaków ISO-8859-1 do UTF-8”, oznacza to, że û był zgodny z ISO-8859-1. Jeśli chcesz, aby UTF-8 był wszędzie (a twój kod PHP nie działa domyślnie w UTF-8), możesz użyć LC_ALL zamiast LC_TIME w setlocale.
Dereckson
6

Jeśli chcesz po prostu tablicę nazw miesięcy od początku roku do końca, np. Aby wypełnić listę rozwijaną, użyłbym tylko następującego;

for ($i = 0; $i < 12; ++$i) {
  $months[$m] = $m = date("F", strtotime("January +$i months"));
}
Trent Renshaw
źródło
6

Istnieje wiele sposobów wydrukowania miesiąca z podanego numeru. Wybierz jeden zestaw dla siebie.

1. funkcja date () wraz z parametrem „F”

Przykład kodu:

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

2. Tworząc obiekt daty php za pomocą funkcji createFromFormat ()

Przykład kodu

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

3. Funkcja strtotime ()

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

4. funkcja mktime ()

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

5. Używając jdmonthname ()

$jd=gregoriantojd($monthNum,10,2019);
echo jdmonthname($jd,0); // Output: Oct
Nishad Up
źródło
4

dostosować zgodnie z wymaganiami

$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
źródło
1
Proste i na temat bez zbędnych konwersji dat.
martti
4

Jeśli masz numer miesiąca, możesz najpierw utworzyć na jego podstawie datę z domyślną datą pierwszego i domyślnego roku bieżącego roku, a następnie wyodrębnić nazwę miesiąca z utworzonej daty:

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

Ten kod zakłada, że ​​numer miesiąca jest przechowywany w $ i

Mam nadzieję, że to komuś pomoże

Bryan Itur
źródło
2

jest to banalnie proste, dlaczego tak wielu ludzi robi takie złe sugestie? @Bora była najbliższa, ale ta jest najsolidniejsza

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

to jest sposób na zrobienie tego

Panie Heelis
źródło
2

Obecnie używam poniższego rozwiązania, aby rozwiązać ten sam problem:

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

Aby dowiedzieć się więcej o ustawieniach lokalnych, przejdź do http://php.net/manual/en/function.setlocale.php

Aby dowiedzieć się więcej o strftime, przejdź do http://php.net/manual/en/function.strftime.php

Ucfirst() jest używany do zamiany pierwszej litery w ciągu na wielką literę.

Cristo Rutazihana
źródło
aby uzyskać zgodność z utf8 spróbuj: utf8_encode (ucfirst (strftime ("% B", strtotime ($ date))));
Mimouni
1
@Mimouni Nie jest to potrzebne, ponieważ funkcja utf8_encode konwertuje ciągi ISO-8859-1 na UTF-8, ale poprzez LC_ALL kod może zostać poinstruowany, aby wyprowadzał UTF-8, na przykład jeśli używasz en_US.UTF-8 zamiast NAS.
Dereckson
2

Tylko jedna linia

DateTime::createFromFormat('!m', $salary->month)->format('F'); //April
Kaushik shrimali
źródło
1

Musisz ustawić pola za pomocą strtotimelubmktime

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

Z mktimezestawem tylko miesiąc. Spróbuj tego:

echo date("F", mktime(0, 0, 0, $result["month"], 1));
Bora
źródło
1
date("F", strtotime($result["month"]))

użyj powyższego kodu

Visakh B Sujathan
źródło
1

To dla wszystkich potrzeb konwersji daty i czasu

 <?php
 $newDate = new DateTime('2019-03-27 03:41:41');
 echo $newDate->format('M d, Y, h:i:s a');
 ?>
imtaher
źródło
1
<?php
$month =1;
$convert =DateTime::createFromFormat('!m', $month);
echo $convert->format('F');
?>
Manjeet Kumar Nai
źródło
0

Myślę, że użycie cal_info () jest najłatwiejszym sposobem konwersji z liczby na ciąg.

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

echo $monthName; //Returns "August"

Zobacz dokumentację dla cal_info ()

boomx09
źródło
0

Wiem, że to pytanie zostało zadane jakiś czas temu, ale doszedłem do wniosku, że każdy, kto szukał tej odpowiedzi, prawdopodobnie starał się po prostu uniknąć pisania całych stwierdzeń if / else, więc napisałem to dla Ciebie, abyś mógł skopiować / wkleić. Jedynym zastrzeżeniem związanym z tą funkcją jest to, że dotyczy ona rzeczywistego numeru miesiąca, a nie liczby indeksowanej 0, więc styczeń = 1, a nie 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";
    }
}
Freaky Turtle
źródło
4
Dlaczego nie użyłeś przełącznika / obudowy?
Artjom B.
Wydaje mi się, że mógłbym to zrobić, głównie osobisty wybór, uważam, że jeśli / inaczej jest łatwiejszy do odczytania, a przy tylko 12 opcjach wszelkie różnice prędkości będą pomijalne.
Freaky Turtle,
to nie działa, jeśli masz witrynę wielojęzyczną
Crustamet
Nie, ale możesz zastąpić zwracane ciągi funkcjami i18n, które zwracają miesiąc w wybranym języku
Freaky Turtle
0

Aby uzyskać nazwę miesiąca, podając numer miesiąca

$ numer_miesiąca = 5;

$ monthName = date ('F', mktime (0, 0, 0, $ numer_miesiąca, 10));

Gdzie „F” zwróci nazwę miesiąca Np. 'Może'

Bijendra Sahu
źródło
0

Tak to zrobiłem

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

zwroty 30 June 2019

Vicky Salunkhe
źródło
0

Proste sztuczki tutaj możesz użyć funkcji strtotime () działającej zgodnie z potrzebami, konwertuj liczbę na nazwę miesiąca.

1.Jeśli chcesz otrzymać wynik w styczniu, lutym i marcu Następnie spróbuj poniżej jednego z parametrem „M” wewnątrz daty.

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

Wyjście: maj

/ 2. Możesz spróbować użyć litery „F” zamiast „M”, aby uzyskać pełną nazwę miesiąca jako wynik styczeń, luty, marzec itd.

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

Wyjście: styczeń

Avinash Raut
źródło
0
$days = ['', 'Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
$month = ( date('m') < 10 ) ? date('m')[1] : date('m');

To wydobywa miesiące.

Geovany Quissanga
źródło
-3

Użyj funkcji natywnej, takiej jak jdmonthname():

echo jdmonthname($monthNum, CAL_MONTH_GREGORIAN_LONG);
Tonin Bolzan
źródło
jdmonthname(3, CAL_MONTH_GREGORIAN_LONG);powracaNovember
Onimusha
jdmonthname () oczekuje dnia juliańskiego, który jest przyrostową liczbą dni używaną w astronomii. Dzień 0 to 1 stycznia 4713 rpne, dzień 1 to 2 stycznia 4713 rpne itd. 20 października 2014 r. (Jako data gregoriańska) to 2456951 dzień juliański (który jako data juliańska to 7 października 2014 r.). Dziwnie, PHP nie radzi sobie właściwie z dniem juliańskim 0: echo jdtojulian (0). "<br/>"; echo jdtojulian (1). "<br/>"; echo jdtojulian (2). "<br/>"; zwraca: 0/0/0 1/2 / -4713 1/3 / -4713
George Langley
-3

Możesz po prostu użyć funkcji monthname () w SQL.

Wybierz nazwę miesiąca (kolumna_data) z grupy tabeli według nazwy miesiąca (kolumna_data)

Sony Krishna Swamy
źródło
1.) Zapytano PHP, a nie SQL 2.) Twoja odpowiedź wydaje się być specyficzna dla MySQL, a nie ogólna SQL.
martti