Ottieni il nome del mese dalla data


Risposte:


1140

Versione più 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 (08-03-2019) - Questa mia risposta, che ho scritto originariamente nel 2009, è obsoleta. Vedi la risposta di David Storey per una soluzione migliore.


401
è un po 'frustrante che anche dopo essere new Date()tornatoTue Sep 06 2011 20:02:25 GMT+0200 (CEST) che significhi chiaramente che l'oggetto Date abbia già tutto questo internamente definito (nomi dei giorni del mese e della settimana) non sia pubblico, quindi dobbiamo digitare di nuovo tutto. :(
zanona,

9
Non è una soluzione ideale se si devono includere i nomi dei mesi per ogni lingua supportata. Deve esserci un modo migliore di usareString#split con toStringo toDateString.
Ryan,

23
lingue multiple = array multidimensionale;) traduzioni ["monthName"] [currentLanguage] [d.getMonth ()]
nuala il

25
@ zanona: un oggetto data non ha necessariamente "tutto ciò definito internamente". Tutto ciò che è richiesto in ECMA-262 è un valore temporale , che è un numero. Quello che vedi è il risultato di Date.prototype.toString , che dipende dall'implementazione.
RobG,

9
@Devin ma che rialloca l'array ogni volta che si desidera accedervi.
Cole Johnson,

777

Ora è possibile farlo con l'API di internazionalizzazione ECMAScript:

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

'long'utilizza il nome completo del mese, 'short'per il nome breve e'narrow' per una versione più minimale, come la prima lettera in lingue alfabetiche.

Puoi modificare le impostazioni internazionali dal browser 'default'a quelle che ti piacciono (ad esempio 'en-us') e utilizzerà il nome corretto per quella lingua / paese.

Con toLocaleStringapi devi passare ogni volta le impostazioni locali e le opzioni. Se hai intenzione di utilizzare le stesse informazioni sulla locale e le stesse opzioni di formattazione in più date diverse, puoi Intl.DateTimeFormatinvece utilizzare :

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".

Per ulteriori informazioni, consultare il mio post sul blog sull'API per l' internazionalizzazione .


1
Posso confermare che Safari Technology Preview ha il supporto per questo. Penso che dovrebbe essere la risposta accettata
Salman Hasrat Khan,

1
Funziona anche nel nodo!
mikemaccana,

4
Ottima soluzione, ma per il mio caso d'uso questo ha finito per essere troppo lento. Stavo elaborando diverse centinaia di articoli ed era in media circa 1 ms per articolo per ottenere sia il mese che l'anno (cromo, safari). Ho finito per usare la risposta accettata, ma solo perché ha funzionato molto meglio. Questo sarebbe il mio metodo preferito se avessi bisogno di chiamarlo solo poche volte.
t.888,

7
Questo è ora supportato sulla maggior parte dei browser: caniuse.com/#search=intl
eyal83

2
Nota su React Native, funziona per dispositivi iOS, ma su Android viene visualizzato in modo errato (sputa semplicemente l'intero timestamp).
Hardanger,

162

Eccone un altro, con supporto per la localizzazione :)

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

puoi quindi aggiungere facilmente il supporto per altre lingue:

Date.locale.fr = {month_names: [...]};

2
Nota questo non funziona sul nodo al 6.x come Date.localeè undefined. è una risposta eccellente per altre implementazioni JS!
mikemaccana,

Ciò potrebbe avere senso se le matrici di nomi localizzate fossero create utilizzando Date.prototype.toLocaleString . Inoltre, l'estensione dei prototipi e degli oggetti incorporati non è considerata una buona idea.
RobG

62

Se non ti dispiace estendere il prototipo Date (e ci sono alcuni buoni motivi per non voler farlo), puoi effettivamente trovare un metodo molto semplice:

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"

Queste funzioni verranno quindi applicate a tutti gli oggetti Date javascript.


6
"e ci sono alcuni buoni motivi per non voler fare questo". Solo curioso: quali motivi vuoi dire?
KooiInc,

13
@Kooilnc: è perché stai essenzialmente lavorando nello spazio globale. Se si importano le funzioni o le librerie di qualcun altro che fanno altrettanto, potrebbero sovrascrivere l'un l'altro.
Nickf

61

Consiglio vivamente la formatfunzione dalla libreria moment.js , che puoi usare in questo modo:

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

Utilizzare "MMMM" anziché "MMM" se è necessario il nome completo del mese

Oltre a un lungo elenco di altre funzionalità, ha un forte supporto per l'internazionalizzazione .


2
Il primo si tradurrebbe in "Apr". "MMM" mostra le prime tre lettere del mese, se si desidera il nome completo utilizzare invece "MMMM". Consulta la loro documentazione per assistenza.
Tomnar,

Se stai seguendo la strada della forte ottimizzazione e della riduzione delle richieste http, questa potrebbe non essere un'opzione per te. Invece, usa solo una matrice di nomi di mese se hai intenzione di formattare i nomi dei mesi in una riga di codice.
OzzyTheGiant,

3
Moment è una libreria molto grande, e decisamente eccessiva per questo. Le moderne alternative includono Luxone date-fns, ancora una volta, al giorno d'oggi esiste un ampio supporto browser per l'API di internazionalizzazione .
Dan Dascalescu il

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

Può essere usato come

var month_Name = new Date().getMonthName();

18

In questo modo è possibile eseguire alcuni semplici processi comuni dall'oggetto data.

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

Oppure puoi creare un prototipo di data simile

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


2
Grazie! Non capisco ancora i prototipi, ma non vedo l'ora di provarlo.
Eric Hepperle - CodeSlayer2010 il

17

Per farlo potresti usare datejs . Controlla il FormatSpecifiers , MMMM ti dà il nome del mese:

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

E datejs lo ha localizzato per più di 150 locali! Vedere qui


12

Provare:

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

var strDate =
    objDate.toLocaleString("en", { day: "numeric" }) + ' ' +
    objDate.toLocaleString("en", { month: "long"  }) + ' ' +
    objDate.toLocaleString("en", { year: "numeric"});

Funzionava nell'inverno 2017! L'uso di "en-us" come suggerito da altri utenti circa 3 anni prima non funziona in Chrome.
Eric Hepperle - CodeSlayer2010 il

9

Ecco un modo che non dipende da un array hardcoded e supporta più localizzazioni.

Se hai bisogno di un intero array:

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 hai bisogno solo di un mese selezionato (più veloce):

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

Testato e funziona bene su Chrome e IE 11. Su mozilla sono necessarie alcune modifiche, perché restituisce l'intera data.


Questo non funzionerà nemmeno in safary. A causa ditoLocaleString
Sergei Panfilov,

8

Sfortunatamente il modo migliore per estrarre il nome del mese è dalla rappresentazione 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'

8

Invece di dichiarare un array che contiene tutto il nome del mese e quindi punta con un indice, possiamo anche scriverlo in una versione più breve come di seguito:

var objDate = new Date().toLocaleString("en-us", { month: "long" }); // result: August
var objDate = new Date().toLocaleString("en-us", { month: "short" }); // result: Aug

si prega di notare che questo non funziona in modo affidabile su tutti i browser ... Safari (mobile e desktop) produrrà qualcosa del genere: MAY 1, 2015 AT 12:00:00 AM GMT-4(quando si utilizzano i { month: "long" }parametri)
David M.

1
puoi anche ottenere il valore predefinito usandonew Date().toLocaleString(navigator.language, { month: "short" })
Remo H. Jansen il

8

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


7

Il formato naturale in questi giorni è usare Moment.js.

Il modo di ottenere il mese in un formato stringa, è molto semplice in Moment.js, non è necessario codificare i nomi dei mesi nel codice: Per ottenere il mese e l'anno correnti nel formato del nome del mese e per l'intero anno (maggio 2015):

  moment(new Date).format("MMMM YYYY");

con il momento già installato per altri scopi, questa è la soluzione più semplice.
Supporto CFP,

1
Moment è una libreria molto grande, e decisamente eccessiva per questo. Le moderne alternative includono Luxone date-fns, ancora una volta, al giorno d'oggi esiste un ampio supporto browser per l'API di internazionalizzazione .
Dan Dascalescu il

7

Un altro modo per formattare la data

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

6

È possibile utilizzare uno dei numerosi formati di data disponibili. Poiché questo rientra nelle specifiche JavaScript, sarà disponibile sia in modalità browser che lato server.

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

per esempio

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

Ce ne sono altri su https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date


4

Se non si desidera utilizzare una libreria esterna o memorizzare una matrice di nomi di mese o se l'API di internazionalizzazione ECMAScript non è abbastanza buona a causa della compatibilità del browser, è sempre possibile farlo alla vecchia maniera estraendo le informazioni dal uscita data:

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

Questo ti darebbe il nome del mese abbreviato, ad esempio ottobre. Credo che la data arriverà in tutti i tipi di formati a seconda dell'inizializzazione e delle impostazioni locali, quindi dai un'occhiata a ciò che toDateString()ritorna e ricalcola i tuoi substring()valori in base a quello.


3

Se stai usando jQuery, probabilmente stai anche usando l'interfaccia utente jQuery, il che significa che puoi usare $ .datepicker.formatDate () .

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

3

La mia migliore soluzione è la seguente:

       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;

mi sembra piuttosto fragile ... e in realtà non risponde alla domanda del PO
David M.

1
Cosa rende questa la tua "migliore soluzione"?
Dan Dascalescu il

3

Con momentjs , basta usare la notazione di formato .

const myDate = new Date()
const shortMonthName = moment(myDate).format('MMM') // Aug
const fullMonthName = moment(myDate).format('MMMM') // August

1
Oltre a questa risposta che ci è già stata data 2 volte, momentè una libreria molto grande, e decisamente eccessiva per questo. Le moderne alternative includono Luxone date-fns, ancora una volta, al giorno d'oggi esiste un ampio supporto browser per l'API di internazionalizzazione .
Dan Dascalescu il

3

Questo può essere fatto anche se stai usando il kendo.

kendo.toString(dateobject, "MMMM");

Ecco un elenco di formattatori dal sito di kendo :

"d" Esegue il rendering del giorno del mese, da 1 a 31.

"dd" Il giorno del mese, da 01 a 31.

"ddd" Il nome abbreviato del giorno della settimana.

"dddd" Il nome completo del giorno della settimana.

"f" I decimi di secondo in un valore di data e ora.

"ff" I centesimi di secondo in un valore di data e ora.

"fff" I millisecondi in un valore di data e ora.

"M" Il mese, da 1 a 12.

"MM" Il mese, da 01 a 12.

"MMM" Il nome abbreviato del mese.

"MMMM" Il nome completo del mese.

"h" L'ora, utilizzando un orologio a 12 ore da 1 a 12.

"hh" L'ora, utilizzando un orologio a 12 ore da 01 a 12.

"H" L'ora, utilizzando un orologio di 24 ore da 1 a 23.

"HH" L'ora, utilizzando un orologio di 24 ore da 01 a 23.

"m" Il minuto, da 0 a 59.

"mm" Il minuto, da 00 a 59.

"s" Il secondo, da 0 a 59.

"ss" Il secondo, da 00 a 59.

"tt" Il designatore AM / PM.

"yy" Gli ultimi due caratteri del valore dell'anno.

"yyyy" L'anno valore pieno.

"zzz" Il fuso orario locale quando si utilizzano i formati per analizzare le stringhe di date UTC.


3

Puoi semplicemente usare Date.toLocaleDateString () e analizzare la data desiderata come parametro

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

Puoi trovare maggiori informazioni nella documentazione di Firefox


2

Se non si desidera utilizzare il momento e si desidera visualizzare il nome del mese -

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

2

Per me questa è la soluzione migliore è,

anche per TypeScript

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

L'output è

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

1

Memorizza i nomi in un array e cerca l'indice del mese.

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

Metodo getMonth () JavaScript


22
Perché no var month = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ];? Molto più breve dell'aggiunta individuale ...
Fizzix,

1

Ho una soluzione parziale che mi è venuta in mente. Utilizza un'espressione regolare per estrarre il nome del mese e del giorno. Ma mentre guardo le opzioni di Regione e Lingua (Windows) mi rendo conto che culture diverse hanno un ordine di formato diverso ... forse un modello di espressione regolare migliore potrebbe essere utile.

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(","));
    }

quindi, minimamente funziona con l'inglese e lo spagnolo ... il sospetto di id è tutto ciò che è GIORNO, MESE data, anno FORMATO
Remus

Ci ho pensato un po ', penso che per avere una soluzione veramente indipendente dal linguaggio avresti bisogno di avere un'espressione regolare che utilizza intervalli di caratteri UNICODE. Le gamme di caratteri sarebbero diverse per i diversi alfabeti, quindi non credo che ci sarebbe una dimensione adatta a tutti i RegExp che potremmo usare.
Remus,

0

Basta estendere le molte altre risposte eccellenti - se si utilizza jQuery - si potrebbe semplicemente fare qualcosa del genere

$.fn.getMonthName = function(date) {

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

    return monthNames[date.getMonth()];

};

dove dateè uguale al var d = new Date(somevalue). Il vantaggio principale di questo è per @nickf detto di evitare lo spazio dei nomi globale.


0

Per ottenere una matrice di nome mese:

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/


0

Basta scrivere un semplice wrapper in giro 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));


0

Ho usato un trucco rapido che funziona bene:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.