Convertire il numero in nome del mese in PHP


152

Ho questo codice PHP:

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

echo $monthName;

Ma sta tornando Decemberpiuttosto che August.

$result["month"]è uguale a 8, quindi la sprintffunzione sta aggiungendo a 0per farlo 08.


6
A meno che non lo converti in una data completa (21-21-2013) o qualcosa che assomiglierebbe molto a una data strtotimenon ha idea di cosa stai cercando di fare. In alternativa basta usare un interruttore per qualcosa del genere.
phpisuber01,

scusa - il risultato $ ["mese"] è 8 perché ho una query SQL che dice selezionare MESE (ora della data) dalla tabella ... quindi nella tabella è un formato di data completo
user2710234

1
Ma strtotimenon ha idea di cosa significhi "8". strtotimeanalizza i timestamp completi come "2012-05-12 08:43:12". Cosa significa "8" in questo contesto?
Inganno

perché non solo echo date( "F", time() );:? Ad esempio, echo date( "F", strtotime("2019-03-09") );uscirà "March"
Rob Watts il

Risposte:


357

Il modo consigliato per farlo:

Al giorno d'oggi, dovresti davvero usare gli oggetti DateTime per qualsiasi data / ora matematica. Ciò richiede che tu abbia una versione di PHP> = 5.2. Come mostrato nella risposta di Glavić , puoi usare quanto segue:

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

Il ! carattere di formattazione viene utilizzato per ripristinare tutto all'epoca Unix . Il mcarattere del formato è la rappresentazione numerica di un mese, con zeri iniziali.

Soluzione alternativa:

Se stai usando una versione precedente di PHP e al momento non riesci ad aggiornare, potresti questa soluzione. Il secondo parametro della date()funzione accetta un timestamp e puoi usarlomktime() per crearne uno, in questo modo:

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

Se vuoi il nome del mese di 3 lettere come Mar, cambia Fin M. L'elenco di tutte le opzioni di formattazione disponibili è disponibile nella documentazione del manuale di PHP .


36
Questo non rispetta le impostazioni locali LC_TIME e genererà sempre il nome del mese in inglese.
Dereckson,

2
Non l'ho mai visto su SO - Errore irreversibile: la chiamata a un formato di funzione membro () su un non oggetto in Noone da 48 plus non ha questo?
Jaroslav Štreit

1
Perché dici che "dovremmo davvero" usare gli oggetti DateTime per questo? Gli oggetti DateTime sono utili, ma la funzione date () è molto più semplice e ha un sovraccarico molto più basso (in termini sia di velocità che di memoria) se tutto ciò che stai cercando di fare è qualcosa di semplice come questo.
or

4
@orrd: se la differenza di velocità tra date () e DateTime risulta essere il collo di bottiglia dell'applicazione che stai creando, direi che hai problemi più grandi di cui preoccuparti. Per le applicazioni reali, dove inevitabilmente dovrai fare altre cose con le date, averlo in un oggetto è un vantaggio in quanto ha un'API più facile da leggere.
Amal Murali,

1
@orrd: Kinda sorpresa semplicemente suggerendo che DateTime merita un downvote: P Tanto per DRY: artima.com/intv/dry.html
Amal Murali

42

Solo perché tutti usano le funzioni strtotime () e date (), mostrerò l' esempio DateTime :

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

In alternativa, è possibile utilizzare DateTime::createFromFormat('m|', $result['month']);per ripristinare solo i campi mancanti.
nullability

C'è un modo per cambiare la lingua usando questa soluzione?
Michel Ayres,

@MichelAyres: No. Dovrai usarlo strftime()per quello.
Amal Murali,

30

Utilizzare mktime():

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

Vedi il manuale di PHP: http://php.net/mktime


C'è un modo per ottenere il numero del mese quando viene passato il nome del mese?
Nisha,

@Nisha usa il parametro "m"restituirà il mese come un numero di 2 cifre come a string. ad esempio gennaio = 01, febbraio = 02
Zac,

18

strtotime si aspetta un formato data standard e restituisce un timestamp.

Sembra che tu stia passando strtotimeuna singola cifra da cui generare un formato data.

Dovresti usare mktimequale prende gli elementi della data come parametri.

Il tuo codice completo:

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

echo $monthName;

Tuttavia, la funzione mktime non richiede uno zero iniziale per il numero del mese, quindi la prima riga è completamente superflua e $result["month"]può essere passata direttamente alla funzione.

Questo può quindi essere combinato in un'unica riga, facendo eco alla data in linea.

Il tuo codice refactored:

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

...


date("F", mktime(null, null, null, 2));Ritorna stranamente Marchinvece di February.
Mischa,

4
Ben notato, @Mischa. Se non si imposta un giorno (il 5o parametro), mktimeverrà utilizzato il giorno corrente. Oggi è il 31. Qual è il 31 febbraio? :)
Greg

Si è verificato un errore nel codice refactored. 1non viene fornito come 5o parametro mktimema come 3o parametro al datequale non produrrebbe risultati attesi
Ejaz

18

Per eseguire la conversione rispetto alla locale corrente, è possibile utilizzare la strftimefunzione:

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

datenon rispetta le impostazioni locali, lo strftimefa.


Grazie, funziona bene! Tuttavia, ho dovuto usarlo $monthName = utf8_encode(strftime('%B', mktime(0, 0, 0, $monthNumber)));per visualizzare personaggi accentuati come in "Août"
Roubi,

2
@Roubi Dato che utf8_encode è documentato come "Codifica una stringa ISO-8859-1 in UTF-8", significa che û era un ISO-8859-1. Se vuoi UTF-8 ovunque (e il tuo codice PHP non viene eseguito di default in UTF-8), puoi usare LC_ALL invece di LC_TIME in setlocale.
Dereckson,

6

Se desideri solo una serie di nomi di mesi dall'inizio dell'anno alla fine, ad esempio per popolare una selezione a discesa, userò solo quanto segue;

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

6

Esistono molti modi per stampare un mese dal numero indicato. Scegli una suite per te.

1. funzione date () insieme al parametro 'F'

Esempio di codice:

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

2. Creando un oggetto data php usando createFromFormat ()

Esempio di codice

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

3. funzione strtotime ()

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

4. Funzione mktime ()

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

5. Utilizzando jdmonthname ()

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

4

adattarsi come richiesto

$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
Semplice e puntuale senza inutili conversioni di date.
martti

4

Se hai il numero del mese, puoi prima creare una data da esso con una data predefinita del 1 ° e dell'anno predefinito dell'anno corrente, quindi estrarre il nome del mese dalla data creata:

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

Questo codice presuppone che il numero del tuo mese sia archiviato in $ i

Spero che questo aiuti qualcuno



2

questo è banalmente facile, perché così tante persone danno suggerimenti così cattivi? @Bora era il più vicino, ma questo è il più robusto

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

questo è il modo di farlo


2

Attualmente sto usando la soluzione seguente per affrontare lo stesso problema:

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

Per saperne di più sull'impostazione delle impostazioni locali, consultare http://php.net/manual/en/function.setlocale.php

Per saperne di più su strftime vai su http://php.net/manual/en/function.strftime.php

Ucfirst() viene utilizzato per scrivere in maiuscolo la prima lettera di una stringa.


per una compatibilità con utf8 provare: utf8_encode (ucfirst (strftime ("% B", strtotime ($ date))));
Mimouni,

1
@Mimouni Questo non è necessario poiché la funzione utf8_encode converte le stringhe ISO-8859-1 in UTF-8, ma tramite LC_ALL, il codice può essere istruito per l'output UTF-8, ad esempio se si utilizza en_US.UTF-8 invece di NOI.
Dereckson,

2

Solo una riga

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

1

È necessario impostare i campi con strtotimeomktime

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

Con mktimeset solo mese. Prova questo:

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


1

Questo per tutte le esigenze di conversione data-ora

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

Penso che usare cal_info () sia il modo più semplice per convertire da numero a stringa.

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

echo $monthName; //Returns "August"

Consulta i documenti per cal_info ()



0

So che questa domanda è stata posta qualche tempo fa, ma ho pensato che tutti quelli che cercavano questa risposta stessero probabilmente solo cercando di evitare di scrivere tutte le dichiarazioni if ​​/ else, quindi l'ho scritto per te in modo da poter copiare / incollare. L'unica avvertenza con questa funzione è che va sul numero effettivo del mese, non su un numero con indice 0, quindi gennaio = 1, non 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
Perché non hai usato switch / case?
Artjom B.

Avrei potuto fare immagino, la scelta personale per lo più, trovo se / altrimenti più facile da leggere, e con solo 12 opzioni, eventuali differenze di velocità saranno trascurabili.
Freaky Turtle,

questo non funziona se si dispone di un sito Web
multilingue

No, ma è possibile sostituire le stringhe restituite con funzioni i18n che restituiscono il mese nella lingua prescelta
Freaky Turtle,

0

Per ottenere il nome del mese fornendo il numero del mese

$ month_number = 5;

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

Dove "F" ti restituirà il nome del mese, ad es. 'Maggio'


0

È così che l'ho fatto

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

ritorna 30 June 2019


0

A semplici trucchi qui è possibile utilizzare la funzione strtotime () realizzabile secondo le proprie necessità, un numero di conversione in nome del mese.

1.Se vuoi un risultato in gennaio, febbraio e marzo, prova sotto uno con la 'M' come parametro all'interno della data.

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

Uscita: maggio

/ 2. Puoi provare con 'F' invece di 'M' per ottenere il nome completo del mese come output gennaio febbraio marzo ecc.

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

Uscita: gennaio


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

Questo estrae i mesi.


-3

Utilizzare una funzione nativa come jdmonthname():

echo jdmonthname($monthNum, CAL_MONTH_GREGORIAN_LONG);

jdmonthname(3, CAL_MONTH_GREGORIAN_LONG);ritornaNovember
Onimusha,

jdmonthname () prevede un giorno giuliano, che è un conteggio incrementale di giorni utilizzati in astronomia. Il giorno 0 era il 01 gennaio 4713 a.C., il giorno 1 era il 2 gennaio 4713 a.C., ecc. Il 20 ottobre 2014 (come data gregoriana) è il giorno giuliano 2456951 (che come data giuliana è il 7 ottobre 2014). PHP stranamente non sembra gestire correttamente lo 0 Julian Day: echo jdtojulian (0). "<br/>"; echo jdtojulian (1). "<br/>"; echo jdtojulian (2). "<br/>"; ritorni: 0/0/0 1/2 / -4713 1/3 / -4713
George Langley

-3

Puoi semplicemente usare la funzione monthname () in SQL.

SELEZIONA monthname (date_column) dal gruppo di tabelle per monthname (date_column)


1.) PHP è stato chiesto, non SQL 2.) La tua risposta sembra essere specifica per MySQL, non per SQL generale.
martti
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.