Obter nome do mês a partir da data

672

Como posso gerar o nome do mês (por exemplo: outubro / outubro) a partir deste objeto de data em JavaScript?

var objDate = new Date("10/11/2009");
Shyju
fonte
Seria bom se stackoverflow.com/a/18648314/5846045 poderia ser aceito para guiar futuros leitores a melhor resposta
Boghyon Hoffmann

Respostas:

1137

Versão mais curta:

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 (08/03/2019) - Esta resposta minha que escrevi originalmente em 2009 está desatualizada. Veja a resposta de David Storey para uma solução melhor.

Jesper
fonte
401
é um pouco frustrante que, mesmo tendo new Date()retornado, o Tue Sep 06 2011 20:02:25 GMT+0200 (CEST)que claramente significa que o objeto Date já tenha tudo isso definido internamente (nomes de dias e dias da semana), ele não seja público, portanto, precisamos digitá-lo novamente. :(
zanona
9
Não é uma solução ideal se for necessário incluir nomes de meses para cada idioma suportado. Tem que haver uma maneira melhor de usar String#splitcom toStringou toDateString.
Ryan
23
vários idiomas = matriz multidimensional;) ​​traduções ["monthName"] [currentLanguage] [d.getMonth ()]
nuala
25
@ zanona - um objeto de data não tem necessariamente "tudo isso definido internamente". Tudo o que é necessário no ECMA-262 é um valor de tempo , que é um número. O que você está vendo é o resultado de Date.prototype.toString , que depende da implementação.
RobG 23/05
9
@ Kevin, mas isso realoca a matriz toda vez que você deseja acessá-la.
Cole Johnson
775

Agora é possível fazer isso com a API de internacionalização do ECMAScript:

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

'long'usa o nome completo do mês, 'short'para o nome abreviado, e'narrow' para uma versão mais mínima, como a primeira letra nos idiomas alfabéticos.

Você pode alterar o código do idioma do navegador 'default'para o que desejar (por exemplo 'en-us'), e ele usará o nome correto para esse idioma / país.

Com a toLocaleStringAPI, é necessário passar o código do idioma e as opções a cada vez. Se você usar as mesmas informações de localidade e opções de formatação em várias datas diferentes, poderá usar Intl.DateTimeFormat:

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 obter mais informações, consulte minha postagem no blog sobre a API de internacionalização .

David Storey
fonte
1
Posso confirmar que o Safari Technology Preview tem suporte para isso. Eu acho que deve ser a resposta aceita
Salman Khan Hasrat
1
Funciona no nó também!
Mckmaccana
4
Ótima solução, mas para o meu caso de uso isso acabou sendo muito lento. Eu estava processando várias centenas de itens e a média era de 1ms por item para obter o mês e o ano (chrome, safari). Acabei usando a resposta aceita, mas apenas porque teve um desempenho muito melhor. Esse seria o meu método preferido se eu precisasse chamá-lo algumas vezes.
t.888 17/11/19
7
Este agora é suportado na maioria dos navegadores: caniuse.com/#search=intl
eyal83
2
Observe que no React Native, isso funciona para dispositivos iOS, mas no Android, ele é exibido incorretamente (apenas indica o carimbo de data / hora inteiro).
Hardanger
162

Aqui está outro, com suporte para localização :)

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']
    }
};

você pode adicionar facilmente suporte para outros idiomas:

Date.locale.fr = {month_names: [...]};
krcko
fonte
2
Observe que isso não funcionará no nó a partir do 6.x como Date.localeestá undefined. é uma excelente resposta para outras implementações de JS!
precisa saber é o seguinte
Isso pode fazer sentido se as matrizes de nomes localizados forem construídas usando Date.prototype.toLocaleString . Além disso, estender protótipos e objetos internos não é considerado uma boa idéia.
RobG
62

Se você não se importa de estender o protótipo Date (e há alguns bons motivos para não querer fazer isso), na verdade, você pode criar um método muito fácil:

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"

Essas funções serão aplicadas a todos os objetos Date do javascript.

nickf
fonte
6
"e existem algumas boas razões para não querer fazer isso". Apenas curioso: que razões você quer dizer?
KooiInc
13
@Kooilnc: É porque você está trabalhando essencialmente no espaço global. Se você importar as funções ou bibliotecas de outras pessoas que também fazem isso, elas poderão se substituir.
nickf
61

Eu recomendo vivamente a formatfunção da biblioteca moment.js , que você pode usar assim:

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" em vez de "MMM" se precisar do nome completo do mês

Além de uma extensa lista de outros recursos, possui forte suporte à internacionalização .

Brian M. Hunt
fonte
2
O primeiro resultaria em "abr". "MMM" mostra as três primeiras letras do mês, se você quiser o nome completo, use "MMMM". Consulte a documentação deles para obter ajuda.
Tomnar
Se você está seguindo o caminho da otimização pesada e da redução de solicitações de HTTP, isso pode não ser uma opção para você. Em vez disso, continue usando apenas uma matriz de nomes de meses se você quiser apenas formatar os nomes de meses em uma linha de código.
OzzyTheGiant
3
Momento é uma biblioteca muito grande e exagerada. As alternativas modernas incluem Luxone date-fns, no entanto, novamente, há amplo suporte de navegador para a API de internacionalização atualmente .
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()];
}

Pode ser usado como

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

Algum processo fácil e comum a partir do objeto de data pode ser feito com isso.

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()))

Ou você pode criar um protótipo de data 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
fonte
2
Obrigado! Ainda não entendo os protótipos, mas estou ansioso para experimentar.
Eric Hepperle - CodeSlayer2010
17

Você pode usar o datejs para fazer isso. Verifique os FormatSpecifiers , MMMM fornece o nome do mês:

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

E o datejs localizou isso para mais de 150 localidades! Veja aqui

Tim Büthe
fonte
12

Tentar:

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
fonte
Isso funcionou no inverno de 2017! O uso de "en-us", conforme sugerido por outros usuários há 3 anos ou mais, não funciona no Chrome.
Eric Hepperle - CodeSlayer2010
9

Aqui está uma maneira que não depende de uma matriz codificada e suporta vários códigos de idioma.

Se você precisar de uma matriz inteira:

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')); // -> ["януари", "февруари", "март", "април", "май", "юни", "юли", "август", "септември", "октомври", "ноември", "декември"]

Se você precisar apenas de um mês selecionado (mais 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

Testado e funciona bem no Chrome e IE 11. No mozilla, são necessárias algumas modificações, pois retorna a data inteira.

Дамян Станчев
fonte
Isso ainda não funcionará em segurança. Por causa detoLocaleString
Sergei Panfilov
8

Infelizmente, a melhor maneira de extrair o nome do mês é da representação 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
fonte
8

Em vez de declarar a matriz que contém todo o nome do mês e apontar com um índice, também podemos escrevê-lo em uma versão mais curta, como abaixo:

var objDate = new Date().toLocaleString("en-us", { month: "long" }); // result: August
var objDate = new Date().toLocaleString("en-us", { month: "short" }); // result: Aug
Anand kumar
fonte
Por favor note que este não funciona de forma confiável em todos os navegadores ... Safari (móveis e desktop) saída será algo assim: MAY 1, 2015 AT 12:00:00 AM GMT-4(quando se utiliza { month: "long" }parâmetros)
David M.
1
você também pode obter o padrão 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
fonte
7

O formato natural hoje em dia é usar o Moment.js.

A maneira de obter o mês em um formato de sequência é muito simples no Moment.js, não é necessário codificar os nomes dos meses no seu código: Para obter o mês e o ano atuais no formato do nome do mês e o ano inteiro (maio de 2015):

  moment(new Date).format("MMMM YYYY");
shacharsol
fonte
com o momento já instalado para outros fins, esta é a solução mais simples.
Suporte CFP
1
Momento é uma biblioteca muito grande e exagerada. As alternativas modernas incluem Luxone date-fns, no entanto, novamente, há amplo suporte de navegador para a API de internacionalização atualmente .
Dan Dascalescu
7

Outra maneira de formatar a data

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

Você pode usar um dos vários formatadores de data disponíveis. Como isso se enquadra na especificação JavaScript, estará disponível nos modos navegador e servidor.

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

por exemplo

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

Há mais em https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

Dinesh
fonte
4

Se você não quiser usar uma biblioteca externa ou armazenar uma matriz de nomes de meses, ou se a API de Internacionalização do ECMAScript não for boa o suficiente devido à compatibilidade do navegador, você sempre poderá fazê-lo da maneira antiga, extraindo as informações do diretório data de saída:

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

Isso forneceria o nome abreviado do mês, por exemplo, outubro. Acredito que a data chegará em todos os tipos de formatos, dependendo da inicialização e do seu código do idioma. Portanto, dê uma olhada no toDateString()retorno e recalcule seus substring()valores com base nisso.

Matt K
fonte
3

Se você estiver usando jQuery, provavelmente também usará a interface do usuário do jQuery, o que significa que você pode usar $ .datepicker.formatDate () .

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

Minha melhor solução é a seguinte:

       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;
user3920942
fonte
parece bastante frágil para mim ... e ele realmente não responder à pergunta do OP
David M.
1
O que faz desta a sua "Melhor Solução"?
Dan Dascalescu
3

Com o momentjs , basta usar a notação de formato .

const myDate = new Date()
const shortMonthName = moment(myDate).format('MMM') // Aug
const fullMonthName = moment(myDate).format('MMMM') // August
lnmunhoz
fonte
1
Além desse answe já ter sido dado duas vezes, momentexiste uma biblioteca muito grande e um exagero para isso. As alternativas modernas incluem Luxone date-fns, no entanto, novamente, há amplo suporte de navegador para a API de internacionalização atualmente .
Dan Dascalescu
3

Isso também pode ser feito se você estiver usando o kendo.

kendo.toString(dateobject, "MMMM");

Aqui está uma lista de formatadores do site kendo :

"d" Renderiza o dia do mês, de 1 a 31.

"dd" O dia do mês, de 01 a 31.

"ddd" O nome abreviado do dia da semana.

"dddd" O nome completo do dia da semana.

"f" Os décimos de segundo em um valor de data e hora.

"ff" Os centésimos de segundo em um valor de data e hora.

"fff" Os milissegundos em um valor de data e hora.

"M" O mês, de 1 a 12.

"MM" O mês, de 01 a 12.

"MMM" O nome abreviado do mês.

"MMMM" O nome completo do mês.

"h" A hora, usando um relógio de 12 horas de 1 a 12.

"hh" A hora, usando um relógio de 12 horas de 01 a 12.

"H" A hora, usando um relógio de 24 horas de 1 a 23.

"HH" A hora, usando um relógio de 24 horas de 01 a 23.

"m" O minuto, de 0 a 59.

"mm" O minuto, de 00 a 59.

"s" O segundo, de 0 a 59.

"ss" O segundo, de 00 a 59.

"tt" O designador AM / PM.

"yy" Os dois últimos caracteres do valor do ano.

"aaaa" O valor total do ano.

"zzz" O fuso horário local ao usar formatos para analisar seqüências de datas UTC.

Navoneel Talukdar
fonte
2

Se você não deseja usar o momento e deseja exibir o nome do mês -

.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
fonte
2

Para mim, esta é a melhor solução,

para TypeScript também

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

Saída é

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

Você pode simplesmente usar o Date.toLocaleDateString () e analisar a data desejada 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'}));

Você pode encontrar mais informações na documentação do Firefox

Andres Paul
fonte
1

Armazene os nomes em uma matriz e procure pelo índice do mês.

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 JavaScript getMonth ()

rahul
fonte
22
Por que não var month = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ];? Muito mais curto do que adicioná-los individualmente ...
Fizzix
1

Eu tenho uma solução parcial que eu criei. Ele usa uma expressão regular para extrair o nome do mês e dia. Mas, ao examinar as opções de região e idioma (Windows), percebo que culturas diferentes têm ordem de formato diferente ... talvez um padrão de expressão regular melhor possa 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
fonte
assim, minimamente ele funciona com qualquer coisa de Inglês e Espanhol ... ID suspeito que é dia, data mês, ano FORMATO
Remus
Eu examinei um pouco, acho que para ter uma solução verdadeiramente independente da linguagem, você precisaria ter uma expressão regular que use intervalos de caracteres UNICODE. Os intervalos de caracteres seriam diferentes para diferentes alfabetos, então eu não acho que haveria um tamanho único para todos os RegExp que pudéssemos usar.
Remus
0

Apenas estendendo as muitas outras excelentes respostas - se você estiver usando jQuery - você poderia fazer algo como

$.fn.getMonthName = function(date) {

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

    return monthNames[date.getMonth()];

};

onde dateé igual ao var d = new Date(somevalue). A principal vantagem disso é por @nickf dito sobre como evitar o espaço para nome global.

Tim
fonte
0

Para obter uma matriz do nome do mês:

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
fonte
0

Basta escrever um invólucro simples 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
fonte
0

Um hack rápido que usei, que funciona bem:

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
fonte