Convertir le nombre en nom du mois en PHP


152

J'ai ce code PHP:

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

echo $monthName;

Mais il revient Decemberplutôt que August.

$result["month"]est égal à 8, donc la sprintffonction ajoute un 0pour le faire 08.


6
À moins que vous ne le convertissiez en une date complète (21/08/2013), ou quelque chose qui ressemblerait étroitement à une date strtotimen'a aucune idée de ce que vous essayez de faire. Sinon, utilisez simplement un interrupteur pour quelque chose comme ça.
phpisuber01

désolé - le résultat $ ["mois"] est 8 parce que j'ai une requête SQL qui dit sélectionner MONTH (date heure) à partir de la table ... donc dans la table c'est un format de date complet
user2710234

1
Mais strtotimen'a aucune idée de ce que signifie "8". strtotimeanalyse les horodatages complets comme "2012-05-12 08:43:12". Que signifie "8" dans ce contexte?
deceze

pourquoi pas simplement echo date( "F", time() );:? Par exemple, echo date( "F", strtotime("2019-03-09") );affichera "Mars"
Rob Watts

Réponses:


357

La manière recommandée de faire ceci:

De nos jours, vous devriez vraiment utiliser des objets DateTime pour tout calcul de date / heure. Cela nécessite que vous ayez une version PHP> = 5.2. Comme le montre la réponse de Glavić , vous pouvez utiliser ce qui suit:

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

Le !caractère de formatage est utilisé pour tout réinitialiser à l' époque Unix . Le mcaractère de format est la représentation numérique d'un mois, avec des zéros non significatifs.

Solution alternative:

Si vous utilisez une ancienne version de PHP et que vous ne pouvez pas mettre à niveau pour le moment, vous pouvez utiliser cette solution. Le deuxième paramètre de date()function accepte un horodatage, et vous pouvez l'utiliser mktime()pour en créer un, comme ceci:

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

Si vous souhaitez que le nom du mois à 3 lettres ressemble à Mar, remplacez-le Fpar M. La liste de toutes les options de formatage disponibles se trouve dans la documentation du manuel PHP .


36
Cela ne respecte pas les paramètres régionaux LC_TIME et affichera toujours le nom du mois en anglais.
Dereckson

2
Je n'ai jamais vu cela sur SO - Erreur fatale: Appel à un format de fonction membre () sur un non-objet dans Noone à partir de 48 pluses n'a pas eu cela?
Jaroslav Štreit

1
Pourquoi dites-vous que nous «devrions vraiment» utiliser des objets DateTime pour cela? Les objets DateTime sont utiles, mais la fonction date () est beaucoup plus simple car elle a une surcharge beaucoup plus faible (en termes de vitesse et de mémoire) si tout ce que vous essayez de faire est quelque chose de simple comme ça.
orrd

4
@orrd: Si la différence de vitesse entre date () et DateTime s'avère être le goulot d'étranglement de l'application que vous créez, je dirais que vous avez de plus gros problèmes à craindre. Pour les applications réelles, où vous devrez inévitablement faire d'autres choses avec les dates, alors l'avoir dans un objet est un meilleur car il a une API plus facile à lire.
Amal Murali le

1
@orrd: Un peu surpris, suggérant simplement que DateTime justifie un vote négatif: P Voilà pour DRY: artima.com/intv/dry.html
Amal Murali

42

Juste parce que tout le monde utilise les fonctions strtotime () et date (), je vais montrer l' exemple de DateTime :

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

Vous pouvez également utiliser DateTime::createFromFormat('m|', $result['month']);pour réinitialiser uniquement les champs manquants.
annulation du

Existe-t-il un moyen de changer la langue en utilisant cette solution?
Michel Ayres le

@MichelAyres: Non. Vous devrez utiliser strftime()pour cela.
Amal Murali le

30

Utilisez mktime():

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

Voir le manuel PHP: http://php.net/mktime


Existe-t-il un moyen d'obtenir le numéro du mois lorsque le nom du mois est passé?
Nisha

@Nisha utilise le paramètre, "m"il renverra le mois sous forme de nombre à 2 chiffres sous forme de string. par exemple janvier = 01, février = 02
Zac

18

strtotime attend un format de date standard et renvoie un horodatage.

Vous semblez passer strtotime un seul chiffre pour sortir un format de date.

Vous devriez utiliser mktime qui prend les éléments de date comme paramètres.

Votre code complet:

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

echo $monthName;

Cependant, la fonction mktime ne nécessite pas de zéro avant le numéro du mois, la première ligne est donc complètement inutile, et $result["month"] peut être passée directement dans la fonction.

Tout cela peut ensuite être combiné en une seule ligne, faisant écho à la date en ligne.

Votre code refactoré:

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

...


date("F", mktime(null, null, null, 2));Retourne étrangement Marchau lieu de February.
Mischa

4
Bien remarqué, @Mischa. Si vous ne définissez pas de jour (le 5ème paramètre), mktimeutilisera le jour actuel. Aujourd'hui, c'est 31e. Qu'est-ce que le 31 février? :)
Greg

Il y a une erreur dans votre code refactoré. 1n'est pas fourni comme 5ème paramètre mktimemais comme 3ème paramètre dateauquel ne produirait pas les résultats attendus
Ejaz

18

Pour effectuer la conversion en respectant les paramètres régionaux actuels, vous pouvez utiliser la strftimefonction:

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

datene respecte pas les paramètres régionaux, strftimefait.


Merci, travaille bien! Cependant, j'ai dû utiliser $monthName = utf8_encode(strftime('%B', mktime(0, 0, 0, $monthNumber)));pour afficher des caractères accentués comme dans 'Août'
Roubi

2
@Roubi Comme utf8_encode est documenté comme "Encode une chaîne ISO-8859-1 en UTF-8", cela signifie que votre û était un ISO-8859-1. Si vous voulez UTF-8 partout (et que votre code PHP ne s'exécute pas par défaut en UTF-8), vous pouvez utiliser LC_ALL au lieu de LC_TIME dans setlocale.
Dereckson

6

Si vous voulez juste un tableau de noms de mois du début de l'année à la fin, par exemple pour remplir une sélection déroulante, j'utiliserais simplement ce qui suit;

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

6

Il existe de nombreuses façons d'imprimer un mois à partir du nombre donné. Choisissez une suite pour vous.

1. fonction date () avec le paramètre 'F'

Exemple de code:

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

2. En créant un objet de date php en utilisant createFromFormat ()

Exemple de code

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

3. fonction strtotime ()

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

4. fonction mktime ()

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

5. En utilisant jdmonthname ()

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

4

adapter au besoin

$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
Simple et précis sans conversions de date inutiles.
martti le

4

Si vous avez le numéro du mois, vous pouvez d'abord créer une date à partir de celui-ci avec une date par défaut du 1er et l'année par défaut de l'année en cours, puis extraire le nom du mois à partir de la date de création:

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

Ce code suppose que votre numéro de mois est stocké dans $ i

J'espère que cela aide quelqu'un



2

c'est trivialement facile, pourquoi tant de gens font-ils de si mauvaises suggestions? @Bora était le plus proche, mais c'est le plus robuste

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

c'est la façon de le faire


2

J'utilise actuellement la solution ci-dessous pour résoudre le même problème:

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

Pour en savoir plus sur les paramètres régionaux définis, accédez à http://php.net/manual/en/function.setlocale.php

Pour en savoir plus sur strftime, rendez-vous sur http://php.net/manual/en/function.strftime.php

Ucfirst() est utilisé pour mettre en majuscule la première lettre d'une chaîne.


pour une compatibilité avec utf8 essayez: utf8_encode (ucfirst (strftime ("% B", strtotime ($ date))));
Mimouni

1
@Mimouni Cela n'est pas nécessaire car la fonction utf8_encode convertit les chaînes ISO-8859-1 en UTF-8, mais via LC_ALL, le code peut être chargé de sortir UTF-8, par exemple si vous utilisez en_US.UTF-8 au lieu de NOUS.
Dereckson


1

Vous devez définir des champs avec strtotimeoumktime

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

Avec mktimeensemble seulement mois. Essaye celui-là:

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


1

Ceci pour tous les besoins de conversion date-heure

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

Je pense que l'utilisation de cal_info () est le moyen le plus simple de convertir un nombre en chaîne.

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

echo $monthName; //Returns "August"

Voir la documentation pour cal_info ()



0

Je sais que cette question a été posée il y a un certain temps maintenant, mais je pensais que tout le monde cherchant cette réponse essayait probablement simplement d'éviter d'écrire toutes les déclarations if / else, alors je l'ai écrite pour vous afin que vous puissiez copier / coller. La seule mise en garde avec cette fonction est qu'elle porte sur le nombre réel du mois, pas sur un nombre indexé à 0, donc janvier = 1, pas 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
Pourquoi n'avez-vous pas utilisé switch / case?
Artjom B. du

J'aurais pu le faire, je suppose, le choix personnel principalement, je trouve if / else plus facile à lire, et avec seulement 12 options, toute différence de vitesse sera négligeable.
Freaky Turtle

cela ne fonctionne pas si vous avez un site Web
multilingue

Non mais vous pouvez remplacer les chaînes renvoyées par des fonctions i18n qui renvoient le mois dans la langue de votre choix
Freaky Turtle

0

Pour obtenir le nom du mois en fournissant le numéro du mois

$ numéro_mois = 5;

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

Où «F» vous renverra le nom du mois Par exemple. 'Mai'


0

C'est comme ça que je l'ai fait

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

Retour 30 June 2019


0

Une astuce simple ici, vous pouvez utiliser la fonction strtotime () réalisable selon vos besoins, un numéro de conversion en nom de mois.

1.Si vous voulez un résultat en janvier, février et mars, essayez ci-dessous un avec le 'M' comme paramètre à l'intérieur de la date.

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

Sortie: mai

/ 2. Vous pouvez essayer avec le 'F' au lieu de 'M' pour obtenir le nom complet du mois en tant que sortie janvier février mars etc.

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

Sortie: janvier


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

Cela extrait les mois.


-3

Utilisez une fonction native telle que jdmonthname():

echo jdmonthname($monthNum, CAL_MONTH_GREGORIAN_LONG);

jdmonthname(3, CAL_MONTH_GREGORIAN_LONG);retoursNovember
Onimusha

jdmonthname () attend un jour julien, qui est un décompte incrémentiel des jours utilisés en astronomie. Le jour 0 était le 1er janvier 4713 avant JC, le jour 1 était le 02 janvier 4713 avant JC, etc. Le 20 octobre 2014 (en date grégorienne) est le jour julien 2456951 (qui en tant que date julienne est le 7 octobre 2014). PHP semble étrangement ne pas gérer correctement le 0 jour julien: echo jdtojulian (0). "<br/>"; echo jdtojulian (1). "<br/>"; echo jdtojulian (2). "<br/>"; renvoie: 0/0/0 1/2 / -4713 1/3 / -4713
George Langley

-3

Vous pouvez simplement utiliser la fonction monthname () dans SQL.

SELECT monthname (date_column) du groupe de tables par monthname (date_column)


1.) PHP a été demandé, pas SQL 2.) Votre réponse semble être spécifique à MySQL, pas SQL générale.
martti le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.