Konvertieren Sie die Nummer in den Monatsnamen in PHP


152

Ich habe diesen PHP-Code:

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

echo $monthName;

Aber es kehrt Decembereher zurück als August.

$result["month"]ist gleich 8, also sprintffügt die Funktion ein hinzu 0, um es zu machen 08.


6
Es sei denn, Sie konvertieren dies in ein vollständiges Datum (21.08.2013) oder etwas, das einem Datum sehr ähnlich wäre, strtotimehat keine Ahnung, was Sie versuchen zu tun. Alternativ können Sie einfach einen Schalter für so etwas verwenden.
Phpisuber01

Entschuldigung - das $ Ergebnis ["Monat"] ist 8, weil ich eine SQL-Abfrage habe, die besagt, dass MONTH (Datum / Uhrzeit) aus der Tabelle ausgewählt werden soll. In der Tabelle ist es also ein vollständiges Datumsformat
user2710234

1
Hat strtotimeaber keine Ahnung was "8" bedeutet. strtotimeanalysiert vollständige Zeitstempel wie "2012-05-12 08:43:12". Was bedeutet "8" in diesem Zusammenhang?
Täuschung

warum nicht einfach : echo date( "F", time() );? Zum Beispiel echo date( "F", strtotime("2019-03-09") );wird "März"
Rob Watts

Antworten:


357

Der empfohlene Weg, dies zu tun:

Heutzutage sollten Sie DateTime-Objekte wirklich für jede Datums- / Zeitmathematik verwenden. Dies erfordert eine PHP-Version> = 5.2. Wie in Glavićs Antwort gezeigt , können Sie Folgendes verwenden:

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

Das !Formatierungszeichen wird verwendet, um alles auf die Unix-Epoche zurückzusetzen . Das mFormatzeichen ist die numerische Darstellung eines Monats mit führenden Nullen.

Alternative Lösung:

Wenn Sie eine ältere PHP-Version verwenden und derzeit kein Upgrade durchführen können, können Sie diese Lösung verwenden. Der zweite date()Funktionsparameter akzeptiert einen Zeitstempel, mit dem Sie einen mktime()erstellen können:

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

Wenn Sie den dreistelligen Monatsnamen mögen Mar, ändern Sie Fzu M. Die Liste aller verfügbaren Formatierungsoptionen finden Sie in der Dokumentation zum PHP-Handbuch .


36
Dies berücksichtigt nicht das Gebietsschema LC_TIME und gibt den Monatsnamen immer in Englisch aus.
Dereckson

2
Ich habe dies bei SO nie gesehen - Schwerwiegender Fehler: Aufruf eines Mitgliedsfunktionsformats () für ein Nicht-Objekt in Noone von 48 Pluspunkten hatte dies nicht?
Jaroslav Štreit

1
Warum sagen Sie, dass wir "wirklich" DateTime-Objekte dafür verwenden sollten? DateTime-Objekte sind nützlich, aber die Funktion date () ist viel einfacher und hat einen viel geringeren Overhead (sowohl hinsichtlich der Geschwindigkeit als auch des Speichers), wenn Sie nur versuchen, etwas Einfaches wie dieses zu tun.
6.

4
@orrd: Wenn sich herausstellt, dass der Geschwindigkeitsunterschied zwischen date () und DateTime der Engpass der von Ihnen erstellten Anwendung ist, würde ich sagen, dass Sie größere Probleme haben, über die Sie sich Sorgen machen müssen. Für tatsächliche Anwendungen, bei denen Sie zwangsläufig andere Dinge mit den Daten tun müssen, ist es überlegen, sie in einem Objekt zu haben, da die API einfacher zu lesen ist.
Amal Murali

1
@orrd: Ein bisschen überrascht, dass DateTime nur eine Ablehnung rechtfertigt: P Soviel zu DRY: artima.com/intv/dry.html
Amal Murali

42

Nur weil jeder die Funktionen strtotime () und date () verwendet, zeige ich das DateTime- Beispiel:

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

Alternativ können Sie DateTime::createFromFormat('m|', $result['month']);nur fehlende Felder zurücksetzen.
Nichtigkeit

Gibt es eine Möglichkeit, die Sprache mit dieser Lösung zu ändern?
Michel Ayres

@ MichaelAyres: Nein. Sie müssen dafür verwenden strftime().
Amal Murali

30

Verwendung mktime():

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

Siehe das PHP-Handbuch: http://php.net/mktime


Gibt es eine Möglichkeit, die Monatsnummer zu erhalten, wenn der Monatsname übergeben wird?
Nisha

@Nisha use paramter "m"gibt den Monat als zweistellige Zahl als zurück string. zB Januar = 01, Februar = 02
Zac

18

strtotime erwartet ein Standard-Datumsformat und gibt einen Zeitstempel zurück.

Sie scheinen strtotimeeine einzelne Ziffer zu übergeben, um ein Datumsformat auszugeben.

Sie sollten verwenden, mktimewelches die Datumselemente als Parameter verwendet.

Ihr vollständiger Code:

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

echo $monthName;

Die Funktion mktime erfordert jedoch keine führende Null zur Monatszahl, sodass die erste Zeile völlig unnötig ist und $result["month"]direkt an die Funktion übergeben werden kann.

Dies kann dann alles in einer einzigen Zeile kombiniert werden, wobei das Datum inline wiedergegeben wird.

Ihr überarbeiteter Code:

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

...


Seltsamerweise date("F", mktime(null, null, null, 2));kehrt Marchstatt February.
Mischa

4
Gut bemerkt, @Mischa. Wenn Sie keinen Tag einstellen (der 5. Parameter), mktimewird der aktuelle Tag verwendet. Heute ist der 31 .. Was ist der 31. Februar? :)
Greg

In Ihrem überarbeiteten Code ist ein Fehler aufgetreten. 1wird nicht als 5. Parameter für bereitgestellt, mktimesondern als 3. Parameter, für dateden keine erwarteten Ergebnisse erzielt werden
Ejaz

18

Um die Konvertierung in Bezug auf das aktuelle Gebietsschema durchzuführen, können Sie die folgende strftimeFunktion verwenden:

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

daterespektiert das Gebietsschema nicht, strftimetut es.


Danke, gut arbeiten! Ich musste es jedoch verwenden $monthName = utf8_encode(strftime('%B', mktime(0, 0, 0, $monthNumber)));, um akzentuierte Zeichen wie in 'Août'
Roubi

2
@Roubi Da utf8_encode als "Codiert einen ISO-8859-1-String in UTF-8" dokumentiert ist, bedeutet dies, dass Ihr û ein ISO-8859-1 war. Wenn Sie UTF-8 überall möchten (und Ihr PHP-Code in UTF-8 nicht standardmäßig ausgeführt wird), können Sie LC_ALL anstelle von LC_TIME in setlocale verwenden.
Dereckson

6

Wenn Sie nur eine Reihe von Monatsnamen vom Anfang des Jahres bis zum Ende möchten, z. B. um eine Dropdown-Auswahl zu füllen, würde ich nur Folgendes verwenden:

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

6

Es gibt viele Möglichkeiten, einen Monat von der angegebenen Nummer zu drucken. Wählen Sie eine Suite für Sie.

1. Funktion date () zusammen mit Parameter 'F'

Codebeispiel:

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

2. Durch Erstellen eines PHP-Datumsobjekts mit createFromFormat ()

Codebeispiel

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

3. Funktion strtotime ()

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

4. mktime () Funktion

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

5. Mit jdmonthname ()

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

4

nach Bedarf anpassen

$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
Einfach und auf den Punkt ohne unnötige Datumskonvertierungen.
Martti

4

Wenn Sie die Monatsnummer haben, können Sie zuerst ein Datum mit dem Standarddatum 1. und dem Standardjahr des aktuellen Jahres erstellen und dann den Monatsnamen aus dem Erstellungsdatum extrahieren:

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

Dieser Code setzt voraus, dass Sie Ihre Monatsnummer in $ i gespeichert haben

Hoffe das hilft jemandem



2

Das ist trivial einfach. Warum machen so viele Leute so schlechte Vorschläge? @Bora war am nächsten, aber dies ist das robusteste

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

Dies ist der Weg, um es zu tun


2

Ich verwende derzeit die folgende Lösung, um das gleiche Problem anzugehen:

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

Weitere Informationen zum festgelegten Gebietsschema finden Sie unter http://php.net/manual/en/function.setlocale.php

Weitere Informationen zu strftime finden Sie unter http://php.net/manual/en/function.strftime.php

Ucfirst() wird verwendet, um den ersten Buchstaben in einer Zeichenfolge groß zu schreiben.


Für eine Kompatibilität mit utf8 versuchen Sie: utf8_encode (ucfirst (strftime ("% B", strtotime ($ date)));
Mimouni

1
@Mimouni Dies wird nicht benötigt, da die Funktion utf8_encode ISO-8859-1-Zeichenfolgen in UTF-8 konvertiert. Über LC_ALL kann der Code jedoch angewiesen werden, UTF-8 auszugeben, wenn Sie beispielsweise en_US.UTF-8 anstelle von verwenden UNS.
Dereckson


1

Sie müssen Felder mit strtotimeoder festlegenmktime

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

Mit mktimenur Monat eingestellt. Probier diese:

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


1

Dies für alle Anforderungen der Datums- / Zeitkonvertierung

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

1
<?php
$month =1;
$convert =DateTime::createFromFormat('!m', $month);
echo $convert->format('F');
?>

0

Ich denke, die Verwendung von cal_info () ist der einfachste Weg, um von Zahl zu Zeichenfolge zu konvertieren.

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

echo $monthName; //Returns "August"

Siehe die Dokumente für cal_info ()



0

Ich weiß, dass diese Frage vor einiger Zeit gestellt wurde, aber ich nahm an, dass jeder, der nach dieser Antwort suchte, wahrscheinlich nur versuchte, das Schreiben der gesamten if / else-Anweisungen zu vermeiden. Deshalb habe ich sie für Sie geschrieben, damit Sie sie kopieren / einfügen können. Die einzige Einschränkung bei dieser Funktion ist, dass sie sich auf die tatsächliche Nummer des Monats bezieht, nicht auf eine 0-indizierte Zahl, also Januar = 1, nicht 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
Warum hast du keinen Schalter / Koffer benutzt?
Artjom B.

Hätte ich wohl tun können, meistens persönliche Wahl, ich finde, ob / sonst leichter zu lesen, und mit nur 12 Optionen werden Geschwindigkeitsunterschiede vernachlässigbar sein.
Freaky Turtle

Dies funktioniert nicht, wenn Sie eine mehrsprachige Website haben
Crustamet

Nein, aber Sie könnten die zurückgegebenen Zeichenfolgen durch i18n-Funktionen ersetzen, die den Monat in der von Ihnen gewählten Sprache zurückgeben
Freaky Turtle

0

Um den Monatsnamen durch Angabe der Monatsnummer zu erhalten

$ month_number = 5;

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

Wo 'F' Ihnen den Monatsnamen zurückgibt, z. 'Kann'


0

So habe ich es gemacht

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

kehrt zurück 30 June 2019


0

Ein einfacher Trick hier können Sie die strtotime () -Funktion verwenden, die je nach Bedarf funktioniert, eine Konvertierungsnummer in einen Monatsnamen.

1.Wenn Sie ein Ergebnis in Jan, Feb und Mar wünschen, versuchen Sie es unter einem mit dem 'M' als Parameter innerhalb des Datums.

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

Ausgabe: Mai

/ 2. Sie können versuchen, mit 'F' anstelle von 'M' den vollständigen Monatsnamen als Ausgabe Januar Februar März usw. zu erhalten.

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

Ausgabe: Januar


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

Das extrahiert die Monate.


-3

Verwenden Sie eine native Funktion wie jdmonthname():

echo jdmonthname($monthNum, CAL_MONTH_GREGORIAN_LONG);

jdmonthname(3, CAL_MONTH_GREGORIAN_LONG);RückkehrNovember
Onimusha

jdmonthname () erwartet einen julianischen TAG, eine inkrementelle Anzahl von Tagen, die in der Astronomie verwendet werden. Tag 0 war der 01. Januar 4713 v. Chr., Tag 1 war der 02. Januar 4713 v. Chr. Usw. Der 20. Oktober 2014 (als gregorianisches Datum) ist der julianische Tag 2456951 (als julianisches Datum der 7. Oktober 2014). PHP scheint seltsamerweise den 0 Julian Day nicht richtig zu handhaben: echo jdtojulian (0). "<br/>"; echo jdtojulian (1). "<br/>"; echo jdtojulian (2). "<br/>"; Rückgabe: 0/0/0 1/2 / -4713 1/3 / -4713
George Langley

-3

Sie können einfach die Funktion monthname () in SQL verwenden.

SELECT Monatsname (Datumsspalte) aus der Tabellengruppe nach Monatsname (Datumsspalte)


1.) PHP wurde gefragt, nicht SQL 2.) Ihre Antwort scheint MySQL-spezifisch zu sein, nicht allgemeines SQL.
Martti
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.