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.

usuario2710234
fuente
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 .

Amal Murali
fuente
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');
Glavić
fuente
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

mintedsky
fuente
¿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));

...

Greg
fuente
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.

Dereckson
fuente
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"));
}
Trent Renshaw
fuente
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
Nishad Up
fuente
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];
zzapper
fuente
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

Bryan Itur
fuente
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

Señor heelis
fuente
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.

Cristo Rutazihana
fuente
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
2

Solo una linea

DateTime::createFromFormat('!m', $salary->month)->format('F'); //April
Kaushik shrimali
fuente
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));
Bora
fuente
1
date("F", strtotime($result["month"]))

usa el código anterior

Visakh B Sujathan
fuente
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');
 ?>
imtaher
fuente
1
<?php
$month =1;
$convert =DateTime::createFromFormat('!m', $month);
echo $convert->format('F');
?>
Manjeet Kumar Nai
fuente
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 ()

boomx09
fuente
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";
    }
}
Tortuga Freaky
fuente
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'

Bijendra Sahu
fuente
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

Vicky Salunkhe
fuente
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

Avinash Raut
fuente
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.

Geovany Quissanga
fuente
-3

Use una función nativa como jdmonthname():

echo jdmonthname($monthNum, CAL_MONTH_GREGORIAN_LONG);
Tonin Bolzan
fuente
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)

Sony Krishna Swamy
fuente
1.) Se le preguntó a PHP, no a SQL 2.) Su respuesta parece ser específica de MySQL, no SQL general.
Martti