Obtener el nombre del mes a partir de la fecha

Respuestas:

1140

Versión más corta:

const monthNames = ["January", "February", "March", "April", "May", "June",
  "July", "August", "September", "October", "November", "December"
];

const d = new Date();
document.write("The current month is " + monthNames[d.getMonth()]);

Nota (2019-03-08): esta respuesta que escribí originalmente en 2009 está desactualizada. Vea la respuesta de David Storey para una mejor solución.

Jesper
fuente
401
es un poco frustrante que incluso al new Date()regresar, lo Tue Sep 06 2011 20:02:25 GMT+0200 (CEST)que claramente significa que el objeto Date ya tiene todo esto definido internamente (nombres de día de mes y semana), no es público, por lo que tenemos que volver a escribirlo todo. :(
zanona
99
No es una solución ideal si hay que incluir nombres de mes para cada idioma admitido. Tiene que haber una mejor manera de usar String#splitcon toStringo toDateString.
Ryan
23
múltiples idiomas = matriz multidimensional;) ​​traducciones ["monthName"] [currentLanguage] [d.getMonth ()]
nuala
25
@ zanona: un objeto de fecha no necesariamente tiene "todo esto definido internamente". Todo lo que se requiere en ECMA-262 es un valor de tiempo , que es un número. Lo que está viendo es el resultado de Date.prototype.toString , que depende de la implementación.
RobG
99
@Devin, pero eso reasigna la matriz cada vez que desea acceder a ella.
Cole Johnson
777

Ahora es posible hacer esto con la API de internacionalización ECMAScript:

const date = new Date(2009, 10, 10);  // 2009-11-10
const month = date.toLocaleString('default', { month: 'long' });
console.log(month);

'long'usa el nombre completo del mes, 'short'para el nombre corto y 'narrow'para una versión más mínima, como la primera letra en idiomas alfabéticos.

Puede cambiar la configuración regional del navegador 'default'a la que prefiera (por ejemplo 'en-us'), y usará el nombre correcto para ese idioma / país.

Con toLocaleStringapi tienes que pasar la configuración regional y las opciones cada vez. Si va a usar la misma información de configuración regional y opciones de formato en varias fechas diferentes, puede usar Intl.DateTimeFormaten su lugar:

const formatter = new Intl.DateTimeFormat('fr', { month: 'short' });
const month1 = formatter.format(new Date());
const month2 = formatter.format(new Date(2003, 5, 12));
console.log(`${month1} and ${month2}`); // current month in French and "juin".

Para obtener más información, consulte mi publicación de blog sobre la API de internacionalización .

David Storey
fuente
1
Puedo confirmar que Safari Technology Preview tiene soporte para esto. Creo que debería ser la respuesta aceptada
Salman Hasrat Khan
1
Funciona en nodo también!
mikemaccana
44
Gran solución, pero para mi caso de uso, esto terminó siendo demasiado lento. Estaba procesando varios cientos de artículos y promediaba aproximadamente 1 ms por artículo para obtener tanto el mes como el año (cromo, safari). Terminé usando la respuesta aceptada pero solo porque funcionó mucho mejor. Este sería mi método preferido si solo tuviera que llamarlo algunas veces.
t.888
77
Esto ahora es compatible con la mayoría de los navegadores: caniuse.com/#search=intl
eyal83
2
Nota sobre React Native, esto funciona para dispositivos iOS, pero en Android, se muestra incorrectamente (solo escupe toda la marca de tiempo).
Hardanger
162

Aquí hay otro, con soporte para localización :)

Date.prototype.getMonthName = function(lang) {
    lang = lang && (lang in Date.locale) ? lang : 'en';
    return Date.locale[lang].month_names[this.getMonth()];
};

Date.prototype.getMonthNameShort = function(lang) {
    lang = lang && (lang in Date.locale) ? lang : 'en';
    return Date.locale[lang].month_names_short[this.getMonth()];
};

Date.locale = {
    en: {
       month_names: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
       month_names_short: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
    }
};

luego puede agregar fácilmente soporte para otros idiomas:

Date.locale.fr = {month_names: [...]};
krcko
fuente
2
Tenga en cuenta que esto no funcionará en el nodo a partir de 6.x tal como Date.localeestá undefined. Sin embargo, es una excelente respuesta para otras implementaciones de JS.
mikemaccana
Esto podría tener sentido si las matrices de nombres localizadas se construyeron usando Date.prototype.toLocaleString . Además, extender prototipos y objetos incorporados no se considera una buena idea.
RobG
62

Si no le importa extender el prototipo de Fecha (y hay algunas buenas razones para no querer hacer esto), puede encontrar un método muy sencillo:

Date.prototype.monthNames = [
    "January", "February", "March",
    "April", "May", "June",
    "July", "August", "September",
    "October", "November", "December"
];

Date.prototype.getMonthName = function() {
    return this.monthNames[this.getMonth()];
};
Date.prototype.getShortMonthName = function () {
    return this.getMonthName().substr(0, 3);
};

// usage:
var d = new Date();
alert(d.getMonthName());      // "October"
alert(d.getShortMonthName()); // "Oct"

Estas funciones se aplicarán a todos los objetos Date de JavaScript.

nickf
fuente
66
"Y hay algunas buenas razones para no querer hacer esto". Solo curiosidad: ¿a qué razones te refieres?
KooiInc
13
@Kooilnc: Es porque esencialmente estás trabajando en el espacio global. Si importa las funciones o bibliotecas de otra persona que también hacen esto, entonces podrían sobrescribirse entre sí.
nickf
61

Recomiendo encarecidamente la formatfunción de la biblioteca moment.js , que puede usar así:

moment().format("MMM");  // "Apr" - current date
moment(new Date(2012, 01, 04)).format("MMM");  // "Feb" - from a local date
moment.utc(new Date(2012, 00, 04).format("MMM"); // "Jan" - from a UTC date

Use "MMMM" en lugar de "MMM" si necesita el nombre completo del mes

Además de una larga lista de otras características, tiene un fuerte apoyo para la internacionalización .

Brian M. Hunt
fuente
2
El primero daría como resultado "Apr". "MMM" muestra las tres primeras letras del mes; si desea el nombre completo, utilice "MMMM". Consulte su documentación para obtener ayuda.
Tomnar
Si va por el camino de una fuerte optimización y reduce las solicitudes http, puede que esta no sea una opción para usted. En su lugar, quédese con solo usar una matriz de nombres de mes si solo va a formatear los nombres de mes en una línea de código.
OzzyTheGiant
3
Moment es una biblioteca muy grande, y es demasiado exagerado para esto. Las alternativas modernas incluyen Luxony date-fns, una vez más, hoy en día existe un amplio soporte de navegador para la API de internacionalización .
Dan Dascalescu
21
Date.prototype.getMonthName = function() {
    var monthNames = [ "January", "February", "March", "April", "May", "June", 
                       "July", "August", "September", "October", "November", "December" ];
    return monthNames[this.getMonth()];
}

Se puede usar como

var month_Name = new Date().getMonthName();
Beena Shetty
fuente
18

Esto puede hacer un proceso fácil común desde el objeto de fecha.

var monthNames = ["January", "February", "March", "April", "May", "June",
  "July", "August", "September", "October", "November", "December"
];
var monthShortNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
];

function dateFormat1(d) {
  var t = new Date(d);
  return t.getDate() + ' ' + monthNames[t.getMonth()] + ', ' + t.getFullYear();
}

function dateFormat2(d) {
  var t = new Date(d);
  return t.getDate() + ' ' + monthShortNames[t.getMonth()] + ', ' + t.getFullYear();
}

console.log(dateFormat1(new Date()))
console.log(dateFormat2(new Date()))

O puedes hacer un prototipo de fecha como

Date.prototype.getMonthName = function() {
  var monthNames = ["January", "February", "March", "April", "May", "June",
    "July", "August", "September", "October", "November", "December"
  ];
  return monthNames[this.getMonth()];
}


Date.prototype.getFormatDate = function() {
  var monthNames = ["January", "February", "March", "April", "May", "June",
    "July", "August", "September", "October", "November", "December"
  ];
  return this.getDate() + ' ' + monthNames[this.getMonth()] + ', ' + this.getFullYear();
}


console.log(new Date().getMonthName())
console.log(new Date().getFormatDate())

Ex:

var dateFormat3 = new Date().getMonthName(); # March

var dateFormat4 = new Date().getFormatDate(); # 16 March, 2017

MAK Ripon
fuente
2
¡Gracias! Todavía no entiendo los prototipos, pero estoy ansioso por probarlo.
Eric Hepperle - CodeSlayer2010
17

Puede usar datejs para hacer eso. Verifique los FormatSpecifiers , MMMM le da el nombre del mes:

var objDate = new Date("10/11/2009");
document.write(objDate.toString("MMMM"));

¡Y datejs consiguió eso localizado para más de 150 locales! Mira aquí

Tim Büthe
fuente
12

Tratar:

var objDate = new Date("10/11/2009");

var strDate =
    objDate.toLocaleString("en", { day: "numeric" }) + ' ' +
    objDate.toLocaleString("en", { month: "long"  }) + ' ' +
    objDate.toLocaleString("en", { year: "numeric"});
beneus
fuente
¡Esto funcionó en el invierno de 2017! Usar "en-us" como lo sugirieron otros usuarios hace 3 años más o menos no funciona en Chrome.
Eric Hepperle - CodeSlayer2010
9

Aquí hay una manera que no depende de una matriz codificada y admite múltiples configuraciones regionales.

Si necesita una matriz completa:

var monthsLocalizedArray = function(locale) {
    var result = [];
    for(var i = 0; i < 12; i++) {
        result.push(new Date(2010,i).toLocaleString(locale,{month:"long"}));
    }
    return result;
};

Uso:

console.log(monthsLocalizedArray('en')); // -> ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
console.log(monthsLocalizedArray('bg')); // -> ["януари", "февруари", "март", "април", "май", "юни", "юли", "август", "септември", "октомври", "ноември", "декември"]

Si solo necesita un mes seleccionado (más rápido):

var monthLocalizedString = function(month, locale) {
    return new Date(2010,month).toLocaleString(locale,{month:"long"});
};

Uso:

console.log(monthLocalizedString(1, 'en')); // -> February
console.log(monthLocalizedString(1, 'bg')); // -> февруари
console.log(monthLocalizedString(1, 'de')); // -> Februar

Probado y funciona bien en Chrome e IE 11. En mozilla se necesitan algunas modificaciones, ya que devuelve la fecha completa.

Дамян Станчев
fuente
Esto no funcionará incluso en safary todavía. PortoLocaleString
Sergei Panfilov
8

Desafortunadamente, la mejor manera de extraer el nombre del mes es desde la representación UTCString:

Date.prototype.monthName = function() {
    return this.toUTCString().split(' ')[2]
};

d = new Date();
//=> Thu Mar 06 2014 23:05:21 GMT+0000 (GMT)

d.monthName();
//=> 'Mar'
Aaron Cronin
fuente
8

En lugar de declarar una matriz que contiene todo el nombre del mes y luego apuntar con un índice, también podemos escribirlo en una versión más corta de la siguiente manera:

var objDate = new Date().toLocaleString("en-us", { month: "long" }); // result: August
var objDate = new Date().toLocaleString("en-us", { month: "short" }); // result: Aug
Anand kumar
fuente
tenga en cuenta que esto no funciona de manera confiable en los navegadores ... Safari (móvil y de escritorio) generará algo así: MAY 1, 2015 AT 12:00:00 AM GMT-4(cuando se usan { month: "long" }parámetros)
David M.
1
También puede obtener el valor predeterminado usandonew Date().toLocaleString(navigator.language, { month: "short" })
Remo H. Jansen
8

document.write(new Date().toLocaleString('en-us',{month:'long', year:'numeric', day:'numeric'}))

AzizStark
fuente
7

El formato natural en estos días es usar Moment.js.

La forma de obtener el mes en formato de cadena es muy simple en Moment.js sin necesidad de codificar los nombres de los meses en su código: Para obtener el mes y año actuales en formato de nombre de mes y año completo (mayo de 2015):

  moment(new Date).format("MMMM YYYY");
shacharsol
fuente
con el momento ya instalado para otros fines, esta es la solución más simple.
Soporte CFP
1
Moment es una biblioteca muy grande, y es demasiado exagerado para esto. Las alternativas modernas incluyen Luxony date-fns, una vez más, hoy en día existe un amplio soporte de navegador para la API de internacionalización .
Dan Dascalescu
7

Otra forma de formatear la fecha

new Date().toLocaleString('en-us',{month:'long', year:'numeric', day:'numeric'}) //output: "May 21, 2019"
venkat7668
fuente
6

Puede usar uno de los varios formateadores de fecha disponibles. Dado que esto se encuentra dentro de la especificación de JavaScript, estará disponible en los modos del navegador y del lado del servidor.

objDate.toString().split(" ")[1]; // gives short name, unsure about locale 
objDate.toLocaleDateString.split(" ")[0]; // gives long name

p.ej

js> objDate = new Date(new Date() - 9876543210)
Mon Feb 04 2013 12:37:09 GMT-0800 (PST)
js> objDate.toString().split(" ")[1]
Feb
js> objDate.toLocaleString().split(" ")[0]
February

Hay más en https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

Dinesh
fuente
4

Si no desea utilizar una biblioteca externa, o almacenar una matriz de nombres de mes, o si la API de internacionalización ECMAScript no es lo suficientemente buena debido a la compatibilidad del navegador, siempre puede hacerlo de la manera tradicional extrayendo la información del salida de fecha:

var now = new Date();
var monthAbbrvName = now.toDateString().substring(4, 7);

Esto le daría el nombre abreviado del mes, por ejemplo, octubre. Creo que la fecha vendrá en todo tipo de formatos dependiendo de la inicialización y su ubicación, así que eche un vistazo a lo que toDateString()regresa y vuelva a calcular sus substring()valores en función de eso.

Matt K
fuente
3

Si está usando jQuery, probablemente también esté usando jQuery UI, lo que significa que puede usar $ .datepicker.formatDate () .

$.datepicker.setDefaults( $.datepicker.regional[ "nl" ] );   // dutch
$.datepicker.formatDate( "dd MM yy", objDate );
mhu
fuente
3

Mi mejor solución es la siguiente:

       var dateValue = Date();
       var month = dateValue.substring(4,7);
       var date = dateValue.substring(8,10);
       var year = dateValue.substring(20,24);
       var finaldateString = date+"-"+month+"-"+year;
usuario3920942
fuente
me parece bastante frágil ... y realmente no responde la pregunta del OP
David M.
1
¿Qué hace que esta sea su "mejor solución"?
Dan Dascalescu
3

Con momentjs , solo usa la notación de formato .

const myDate = new Date()
const shortMonthName = moment(myDate).format('MMM') // Aug
const fullMonthName = moment(myDate).format('MMMM') // August
Inmunhoz
fuente
1
Además de que esta respuesta ya se ha dado 2 veces, momentes una biblioteca muy grande y exagerada para esto. Las alternativas modernas incluyen Luxony date-fns, una vez más, hoy en día existe un amplio soporte de navegador para la API de internacionalización .
Dan Dascalescu
3

Esto también se puede hacer si está utilizando kendo.

kendo.toString(dateobject, "MMMM");

Aquí hay una lista de formateadores del sitio de kendo :

"d" Representa el día del mes, del 1 al 31.

"dd" El día del mes, del 01 al 31.

"ddd" El nombre abreviado del día de la semana.

"dddd" El nombre completo del día de la semana.

"f" Las décimas de segundo en un valor de fecha y hora.

"ff" Las centésimas de segundo en un valor de fecha y hora.

"fff" Los milisegundos en un valor de fecha y hora.

"M" El mes, del 1 al 12.

"MM" El mes, del 01 al 12.

"MMM" El nombre abreviado del mes.

"MMMM" El nombre completo del mes.

"h" La hora, usando un reloj de 12 horas de 1 a 12.

"hh" La hora, usando un reloj de 12 horas de 01 a 12.

"H" La hora, usando un reloj de 24 horas del 1 al 23.

"HH" La hora, usando un reloj de 24 horas del 01 al 23.

"m" El minuto, de 0 a 59.

"mm" El minuto, de 00 a 59.

"s" El segundo, de 0 a 59.

"ss" El segundo, de 00 a 59.

"tt" El designador AM / PM.

"yy" Los dos últimos caracteres del valor del año.

"aaaa" El valor total del año.

"zzz" La zona horaria local cuando se utilizan formatos para analizar cadenas de fechas UTC.

Navoneel Talukdar
fuente
3

Simplemente puede usar Date.toLocaleDateString () y analizar la fecha deseada como parámetro

const event = new Date(Date.UTC(2012, 11, 20, 3, 0, 0));

const options = {  year: 'numeric', month: 'short', day: 'numeric' };

console.log(event.toLocaleDateString('de-DE', options));
// expected output: Donnerstag, 20. Dezember 2012

console.log(event.toLocaleDateString('en-US', options));
// US format 


// In case you only want the month
console.log(event.toLocaleDateString(undefined, { month: 'short'}));
console.log(event.toLocaleDateString(undefined, { month: 'long'}));

Puedes encontrar más información en la documentación de Firefox

Andres Paul
fuente
2

Si no desea utilizar el momento y desea mostrar el nombre del mes,

.config($mdDateLocaleProvider) {
    $mdDateLocaleProvider.formatDate = function(date) {      
      if(date !== null) {
        if(date.getMonthName == undefined) {
          date.getMonthName = function() {
            var monthNames = [ "January", "February", "March", "April", "May", "June", 
            "July", "August", "September", "October", "November", "December" ];
            return monthNames[this.getMonth()];
          }
        }        
        var day = date.getDate();
        var monthIndex = date.getMonth();
        var year = date.getFullYear();
        return day + ' ' + date.getMonthName() + ' ' + year;
      }
    };
  }
Kanchan
fuente
2

Para mí esta es la mejor solución es,

para TypeScript también

const env = process.env.REACT_APP_LOCALE || 'en';

const namedMonthsArray = (index?: number): string[] | string => {
  const months = [];

  for (let month = 0; month <= 11; month++) {
    months.push(
      new Date(new Date('1970-01-01').setMonth(month))
        .toLocaleString(env, {
          month: 'long',
        })
        .toString(),
    );
  }
  if (index) {
    return months[index];
  }
  return months;
};

La salida es

["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
Kratak
fuente
1

Almacene los nombres en una matriz y busque por el índice del mes.

var month=new Array(12);
month[0]="January";
month[1]="February";
month[2]="March";
month[3]="April";
month[4]="May";
month[5]="June";
month[6]="July";
month[7]="August";
month[8]="September";
month[9]="October";
month[10]="November";
month[11]="December";

document.write("The current month is " + month[d.getMonth()]);

Método getMonth () de JavaScript

rahul
fuente
22
¿Por qué no var month = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ];? Mucho más corto que agregarlos individualmente ...
Fizzix
1

Tengo una solución parcial que se me ocurrió. Utiliza una expresión regular para extraer el nombre del mes y el día. Pero cuando miro a través de las opciones de Región e Idioma (Windows) me doy cuenta de que las diferentes culturas tienen un orden de formato diferente ... tal vez un mejor patrón de expresión regular podría ser útil.

function testDateInfo() {
        var months = new Array();
        var days = new Array();
        var workingDate = new Date();
        workingDate.setHours(0, 0, 0, 0);
        workingDate.setDate(1);
        var RE = new RegExp("([a-z]+)","ig");
        //-- get day names 0-6
        for (var i = 0; i < 7; i++) {

            var day = workingDate.getDay();
            //-- will eventually be in order
            if (days[day] == undefined)
                days[day] = workingDate.toLocaleDateString().match(RE)[0];
            workingDate.setDate(workingDate.getDate() + 1);
        }
        //--get month names 0-11
        for (var i = 0; i < 12; i++) {
            workingDate.setMonth(i);
            months.push(workingDate.toLocaleDateString().match(RE)[1]);
        }
        alert(days.join(",") + " \n\r " + months.join(","));
    }
Remus
fuente
entonces, mínimamente funciona con inglés y español ... la identificación sospecha cualquier cosa que sea DÍA, MES fecha, año FORMATO
Remus
Lo he investigado un poco, creo que para tener una solución verdaderamente independiente del lenguaje, necesitaría tener una expresión regular que use rangos de caracteres UNICODE. Los rangos de caracteres serían diferentes para diferentes alfabetos, así que no creo que haya una talla única para todos los RegExp que podamos usar.
Remus
0

Simplemente extendiendo las muchas otras excelentes respuestas, si está utilizando jQuery, podría hacer algo como

$.fn.getMonthName = function(date) {

    var monthNames = [
    "January", "February", "March",
    "April", "May", "June",
    "July", "August", "September",
    "October", "November", "December"
    ];

    return monthNames[date.getMonth()];

};

donde datees igual a la var d = new Date(somevalue). La principal ventaja de esto es por @nickf dijo sobre evitar el espacio de nombres global.

Tim
fuente
0

Para obtener una matriz de nombre de mes:

Date.monthNames = function( ) {
var arrMonth = [],
    dateRef = new Date(),
    year = dateRef.getFullYear();

dateRef.setMonth(0);
while (year == dateRef.getFullYear()) {
    /* push le mois en lettre et passe au mois suivant */
    arrMonth.push( (dateRef.toLocaleString().split(' '))[2] );
    dateRef.setMonth( dateRef.getMonth() + 1);
}

return arrMonth;
}

alert(Date.monthNames().toString());

// -> janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre

http://jsfiddle.net/polinux/qb346/

vava
fuente
0

Simplemente escriba un contenedor simple alrededor toLocaleString:

function LocalDate(locale) {
  this.locale = locale;
}

LocalDate.prototype.getMonthName = function(date) {
  return date.toLocaleString(this.locale,{month:"long"});
};

var objDate = new Date("10/11/2009");

var localDate = new LocalDate("en");
console.log(localDate.getMonthName(objDate));

localDate.locale = "ru";
console.log(localDate.getMonthName(objDate));

localDate.locale = "zh";
console.log(localDate.getMonthName(objDate));

John Slegers
fuente
0

Un truco rápido que utilicé que funciona bien:

const monthNumber = 8;
const yearNumber = 2018;
const date = `${['Jan', 'Feb', 'Mar', 'Apr',
  'May', 'Jun', 'Jul', 'Aug',
  'Sep', 'Oct', 'Nov', 'Dec'][monthNumber - 1]
      } ${yearNumber}`;

console.log(date);

James Heazlewood
fuente