Convertir número a nombre de mes en PHP


152

Tengo este código PHP:

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

echo $monthName;

Pero está regresando en Decemberlugar de August.

$result["month"]es igual a 8, por lo que la sprintffunción está agregando a 0para hacerlo 08.


66
A menos que convierta esto en una fecha completa (21/08/2013), o algo que se parezca mucho a una fecha strtotimeno tiene idea de lo que está tratando de hacer. Alternativamente, solo use un interruptor para algo como esto.
phpisuber01

lo siento, el resultado de $ ["mes"] es 8 porque tengo una consulta SQL que dice seleccionar MES (fecha y hora) de la tabla ... así que en la tabla es un formato de fecha completo
user2710234

1
Pero strtotimeno tiene idea de lo que significa "8". strtotimeanaliza marcas de tiempo completas como "2012-05-12 08:43:12". ¿Qué significa "8" en este contexto?
Fallecimiento

¿Por qué no solo echo date( "F", time() );:? Por ejemplo, echo date( "F", strtotime("2019-03-09") );saldrá "Marzo"
Rob Watts

Respuestas:


357

La forma recomendada de hacer esto:

Hoy en día, realmente debería usar objetos DateTime para cualquier matemática de fecha / hora. Esto requiere que tengas una versión PHP> = 5.2. Como se muestra en la respuesta de Glavić , puede usar lo siguiente:

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

El !carácter de formato se utiliza para restablecer todo a la época de Unix . El mcarácter de formato es la representación numérica de un mes, con ceros a la izquierda.

Solución alternativa:

Si está utilizando una versión PHP anterior y no puede actualizar en este momento, podría utilizar esta solución. El segundo parámetro de date()función acepta una marca de tiempo, y podría usarla mktime()para crear una, de esta manera:

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

Si desea el nombre del mes de 3 letras Mar, cambie Fa M. La lista de todas las opciones de formato disponibles se puede encontrar en la documentación del manual de PHP .


36
Esto no respeta la configuración regional LC_TIME y siempre mostrará el nombre del mes en inglés.
Dereckson

2
Nunca vi esto en SO - Error fatal: la llamada a un formato de función miembro () en un no objeto en Noone de 48 más no tenía esto?
Jaroslav Štreit

1
¿Por qué dice que "realmente" deberíamos estar usando objetos DateTime para esto? Los objetos DateTime son útiles, pero la función date () es mucho más simple ya que tiene una sobrecarga mucho menor (en términos de velocidad y memoria) si todo lo que está tratando de hacer es algo simple como esto.
orden

44
@orrd: si la diferencia de velocidad entre date () y DateTime resulta ser el cuello de botella de la aplicación que está creando, diría que tiene mayores problemas de los que preocuparse. Para aplicaciones reales, donde inevitablemente necesitará hacer otras cosas con las fechas, entonces tenerlo en un objeto es superior, ya que tiene una API más fácil de leer.
Amal Murali

1
@orrd: Un poco sorprendido simplemente sugiriendo que DateTime garantiza un voto negativo
Amal Murali

42

Solo porque todos usan las funciones strtotime () y date (), mostraré el ejemplo de DateTime :

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

Alternativamente, puede usar DateTime::createFromFormat('m|', $result['month']);para restablecer solo los campos que faltan.
nulabilidad

¿Hay alguna manera de cambiar el idioma con esta solución?
Michel Ayres

@MichelAyres: No. Tendrás que usar strftime()para eso.
Amal Murali

30

Uso mktime():

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

Consulte el manual de PHP: http://php.net/mktime


¿Hay alguna forma de obtener el número de mes cuando se pasa el nombre del mes?
Nisha

@Nisha usa el parámetro "m"devolverá el mes como un número de 2 dígitos como a string. por ejemplo, enero = 01, febrero = 02
Zac

18

strtotime espera un formato de fecha estándar y devuelve una marca de tiempo.

Parece que está pasando strtotimeun solo dígito para generar un formato de fecha.

Debería usar el mktimeque toma los elementos de fecha como parámetros.

Tu código completo:

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

echo $monthName;

Sin embargo, la función mktime no requiere un cero inicial al número de mes, por lo que la primera línea es completamente innecesaria y $result["month"]se puede pasar directamente a la función.

Esto se puede combinar en una sola línea, haciendo eco de la fecha en línea.

Su código refactorizado:

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

...


Extrañamente date("F", mktime(null, null, null, 2));regresa en Marchlugar de February.
Mischa

44
Bien notado, @Mischa. Si no establece un día (el quinto parámetro), mktimeutilizará el día actual. Hoy es el 31 ¿Qué es el 31 de febrero? :)
Greg

Hay un error en su código refactorizado. 1no está siendo proporcionado como quinto parámetro para mktimesino como tercera parámetro a dateresultados que no produciría esperados
Ejaz

18

Para realizar la conversión con respecto a la configuración regional actual, puede usar la strftimefunción:

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

dateno respeta el entorno local, lo strftimehace.


Gracias, trabajando bien! Sin embargo, tuve que usar $monthName = utf8_encode(strftime('%B', mktime(0, 0, 0, $monthNumber)));para mostrar caracteres acentuados como en 'Août'
Roubi

2
@Roubi Como utf8_encode se documenta como "Codifica una cadena ISO-8859-1 para UTF-8", significa que su û era un ISO-8859-1. Si desea UTF-8 en todas partes (y su código PHP no se ejecuta por defecto en UTF-8), puede usar LC_ALL en lugar de LC_TIME en setlocale.
Dereckson el

6

Si solo desea una variedad de nombres de mes desde el comienzo del año hasta el final, por ejemplo, para completar una selección desplegable, simplemente usaría lo siguiente;

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

6

Hay muchas formas de imprimir un mes desde el número dado. Elige una suite para ti.

1. función date () junto con el parámetro 'F'

Ejemplo de código:

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

2. Al crear un objeto de fecha php usando createFromFormat ()

Ejemplo de código

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

3. función strtotime ()

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

4. función mktime ()

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

5. Al usar jdmonthname ()

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

4

adaptar según sea necesario

$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 y al punto sin conversiones de fechas innecesarias.
Martti

4

Si tiene el número de mes, primero puede crear una fecha a partir de él con una fecha predeterminada del primer año y el año predeterminado del año actual, luego extraer el nombre del mes de la fecha de creación:

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

Este código supone que tiene su número de mes almacenado en $ i

Espero que esto ayude a alguien



2

Esto es trivialmente fácil, ¿por qué hay tanta gente haciendo tan malas sugerencias? @Bora fue el más cercano, pero este es el más robusto

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

Esta es la manera de hacerlo


2

Actualmente estoy usando la solución a continuación para abordar el mismo 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;

Para leer más sobre la configuración regional, vaya a http://php.net/manual/en/function.setlocale.php

Para obtener más información sobre strftime, vaya a http://php.net/manual/en/function.strftime.php

Ucfirst() se usa para poner en mayúscula la primera letra de una cadena.


para una compatibilidad con utf8 intente: utf8_encode (ucfirst (strftime ("% B", strtotime ($ date))));
Mimouni

1
@Mimouni Esto no es necesario ya que la función utf8_encode convierte las cadenas ISO-8859-1 en UTF-8, pero a través de LC_ALL, el código puede recibir instrucciones de salida UTF-8, por ejemplo, si usa en_US.UTF-8 en lugar de NOS.
Dereckson el


1

Necesita establecer campos con strtotimeomktime

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

Con mktimeset solo mes. Prueba este:

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


1

Esto para todas las necesidades de conversión de fecha y hora

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

Creo que usar cal_info () es la forma más fácil de convertir de número a cadena.

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

echo $monthName; //Returns "August"

Ver los documentos para cal_info ()



0

Sé que esta pregunta se hizo hace un tiempo, pero pensé que todos los que buscaban esta respuesta probablemente solo trataban de evitar escribir las declaraciones if / else completas, así que lo escribí para que puedan copiar / pegar. La única advertencia con esta función es que va en el número real del mes, no en un número indexado a 0, por lo que enero = 1, no 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";
    }
}

44
¿Por qué no usaste switch / case?
Artjom B.

Supongo que podría haberlo hecho, la elección personal en su mayoría, me parece / más fácil de leer, y con solo 12 opciones, cualquier diferencia de velocidad será insignificante.
Freaky Turtle

esto no funciona si tiene un sitio web basado en varios idiomas
Crustamet

No, pero podría reemplazar las cadenas devueltas con funciones i18n que devuelven el mes en el idioma elegido
Freaky Turtle

0

Para obtener el nombre del mes proporcionando el número de mes

$ mes_número = 5;

$ mesNombre = fecha ('F', mktime (0, 0, 0, $ mes_número, 10));

Donde 'F' te devolverá el nombre del mes Ej. 'Mayo'


0

Así es como lo hice

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

devoluciones 30 June 2019


0

Un truco simple aquí puede usar la función strtotime () viable según su necesidad, un número de conversión al nombre del mes.

1.Si desea un resultado en enero, febrero y marzo, intente debajo de uno con la 'M' como parámetro dentro de la fecha.

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

Salida: mayo

/ 2. Puede intentar con la 'F' en lugar de la 'M' para obtener el nombre completo del mes como salida enero febrero marzo, etc.

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

Salida: enero


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

Eso extrae los meses.


-3

Use una función nativa como jdmonthname():

echo jdmonthname($monthNum, CAL_MONTH_GREGORIAN_LONG);

jdmonthname(3, CAL_MONTH_GREGORIAN_LONG);vuelveNovember
Onimusha

jdmonthname () espera un Julian DAY, que es un recuento incremental de días utilizados en astronomía. El día 0 fue el 1 de enero de 4713 a. C., el día 1 fue el 2 de enero de 4713 a. C., etc. El 20 de octubre de 2014 (como fecha gregoriana) es el día juliano 2456951 (que como fecha juliana es el 7 de octubre de 2014). PHP extrañamente no parece manejar el 0 Julian Day correctamente: echo jdtojulian (0). "<br/>"; echo jdtojulian (1). "<br/>"; echo jdtojulian (2). "<br/>"; regresa: 0/0/0 1/2 / -4713 1/3 / -4713
George Langley

-3

Puede usar la función monthname () en SQL.

SELECCIONE el nombre del mes (fecha_columna) del grupo de tablas por nombre del mes (fecha_columna)


1.) Se le preguntó a PHP, no a SQL 2.) Su respuesta parece ser específica de MySQL, no SQL general.
Martti
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.