Obtenir le nom du mois à partir de la date

672

Comment puis-je générer le nom du mois (par exemple: octobre / octobre) à partir de cet objet de date en JavaScript?

var objDate = new Date("10/11/2009");
Shyju
la source
Ce serait bien si stackoverflow.com/a/18648314/5846045 pouvait être accepté pour guider les futurs lecteurs vers une meilleure réponse
Boghyon Hoffmann

Réponses:

1140

Version plus courte:

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

Note (2019-03-08) - Cette réponse que j'ai écrite à l'origine en 2009 est obsolète. Voir la réponse de David Storey pour une meilleure solution.

Jesper
la source
401
il est un peu frustrant que même le new Date()retour, Tue Sep 06 2011 20:02:25 GMT+0200 (CEST)ce qui signifie clairement que l'objet Date ait déjà tout cela défini en interne (noms de mois et de jours de la semaine), il ne soit pas public, nous devons donc tout taper à nouveau. :(
zanona
9
Ce n'est pas une solution idéale si l'on doit inclure des noms de mois pour chaque langue prise en charge. Il doit y avoir une meilleure façon d'utiliser String#splitavec toStringou toDateString.
Ryan
23
plusieurs langues = tableau multidimensionnel;) traductions ["monthName"] [currentLanguage] [d.getMonth ()]
nuala
25
@ zanona: un objet date n'a pas nécessairement "tout cela défini en interne". Tout ce qui est requis dans ECMA-262 est une valeur de temps , qui est un nombre. Ce que vous voyez est le résultat de Date.prototype.toString , qui dépend de l'implémentation.
RobG
9
@Devin mais qui réalloue le tableau chaque fois que vous souhaitez y accéder.
Cole Johnson
777

Il est maintenant possible de le faire avec l'API d'internationalisation ECMAScript:

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

'long'utilise le nom complet du mois, 'short'pour le nom court et 'narrow'pour une version plus minimale, comme la première lettre dans les langues alphabétiques.

Vous pouvez changer les paramètres régionaux du navigateur 'default'en ceux qui vous plaisent (par exemple 'en-us'), et il utilisera le bon nom pour cette langue / pays.

Avec l' toLocaleStringapi, vous devez passer à chaque fois les paramètres régionaux et les options. Si vous allez utiliser les mêmes informations de paramètres régionaux et options de formatage à plusieurs dates différentes, vous pouvez utiliser à la Intl.DateTimeFormatplace:

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

Pour plus d'informations, consultez mon article de blog sur l' API d'internationalisation .

David Storey
la source
1
Je peux confirmer que l'aperçu de la technologie Safari prend en charge cela. Je pense que devrait être la réponse acceptée
Salman Hasrat Khan
1
Fonctionne également dans le nœud!
mikemaccana
4
Excellente solution, mais pour mon cas d'utilisation, cela a fini par être trop lent. Je traitais plusieurs centaines d'articles et cela faisait en moyenne environ 1 ms par article pour obtenir à la fois le mois et l'année (chrome, safari). J'ai fini par utiliser la réponse acceptée, mais uniquement parce qu'elle fonctionnait beaucoup mieux. Ce serait ma méthode préférée si je n'avais qu'à l'appeler quelques fois.
t.888
7
Ceci est désormais pris en charge sur la plupart des navigateurs: caniuse.com/#search=intl
eyal83
2
Remarque sur React Native, cela fonctionne pour les appareils iOS, mais sur Android, il s'affiche de manière incorrecte (crache simplement l'intégralité de l'horodatage).
hardanger
162

En voici une autre, avec prise en charge de la localisation :)

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

vous pouvez ensuite facilement ajouter la prise en charge d'autres langues:

Date.locale.fr = {month_names: [...]};
krcko
la source
2
Notez cela ne fonctionnera pas sur le noeud à partir de 6.x comme Date.localeest undefined. c'est une excellente réponse pour les autres implémentations JS!
mikemaccana
Cela peut avoir un sens si les tableaux de noms localisés ont été créés à l' aide de Date.prototype.toLocaleString . De plus, l'extension des prototypes et des objets intégrés n'est pas considérée comme une bonne idée.
RobG
62

Si cela ne vous dérange pas d'étendre le prototype Date (et il y a de bonnes raisons de ne pas vouloir le faire), vous pouvez en fait trouver une méthode très simple:

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"

Ces fonctions s'appliqueront alors à tous les objets Date javascript.

nickf
la source
6
"et il y a de bonnes raisons de ne pas vouloir faire cela". Juste curieux: quelles raisons voulez-vous dire?
KooiInc
13
@Kooilnc: C'est parce que vous travaillez essentiellement dans l'espace mondial. Si vous importez les fonctions ou les bibliothèques de quelqu'un d'autre qui le font également, ils pourraient se remplacer les uns les autres.
nickf
61

Je recommande chaleureusement la formatfonction de la bibliothèque moment.js , que vous pouvez utiliser comme ceci:

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

Utilisez "MMMM" au lieu de "MMM" si vous avez besoin du nom complet du mois

En plus d'une longue liste d'autres fonctionnalités, il bénéficie d'un solide soutien à l'internationalisation .

Brian M. Hunt
la source
2
Le premier résulterait en "avril". "MMM" affiche les trois premières lettres du mois, si vous voulez le nom complet, utilisez "MMMM" à la place. Consultez leur documentation pour obtenir de l'aide.
Tomnar
Si vous optez pour l'optimisation intensive et la réduction des requêtes http, cela peut ne pas être une option pour vous. Au lieu de cela, respectez simplement l'utilisation d'un tableau de noms de mois si vous ne formatez les noms de mois que sur une seule ligne de code.
OzzyTheGiant
3
Moment est une très grande bibliothèque, et beaucoup trop pour cela. Les alternatives modernes incluent Luxonet date-fns, mais là encore, il existe un large support de navigateur pour l'API d'internationalisation de nos jours .
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()];
}

Il peut être utilisé comme

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

Un processus simple courant à partir d'un objet date peut être effectué par cela.

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 vous pouvez faire un prototype de date comme

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
la source
2
Merci! Je ne comprends pas encore les prototypes, mais j'ai hâte de faire un essai.
Eric Hepperle - CodeSlayer2010
17

Vous pouvez utiliser datejs pour ce faire. Vérifiez les FormatSpecifiers , MMMM vous donne le nom du mois:

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

Et datejs l'a localisé pour plus de 150 locales! Vois ici

Tim Büthe
la source
12

Essayer:

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
la source
Cela a fonctionné à l'hiver 2017! L'utilisation de "en-us" comme suggéré par d'autres utilisateurs 3 ans plus tôt ne fonctionne pas dans Chrome.
Eric Hepperle - CodeSlayer2010
9

Voici un moyen qui ne dépend pas d'un tableau codé en dur et prend en charge plusieurs paramètres régionaux.

Si vous avez besoin d'un tableau complet:

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

Usage:

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

Si vous n'avez besoin que d'un mois sélectionné (plus rapide):

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

Usage:

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

Testé et fonctionne très bien sur Chrome et IE 11. Sur mozilla, certaines modifications sont nécessaires, car il renvoie la date entière.

Дамян Станчев
la source
Cela ne fonctionnera pas encore, même en toute sécurité. À cause detoLocaleString
Sergei Panfilov
8

Malheureusement, la meilleure façon d'extraire le nom du mois est à partir de la représentation 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
la source
8

Au lieu de déclarer un tableau qui contient tout le nom du mois, puis de pointer avec un index, nous pouvons également l'écrire dans une version plus courte comme ci-dessous:

var objDate = new Date().toLocaleString("en-us", { month: "long" }); // result: August
var objDate = new Date().toLocaleString("en-us", { month: "short" }); // result: Aug
Anand kumar
la source
veuillez noter que cela ne fonctionne pas de manière fiable sur tous les navigateurs ... Safari (mobile et bureau) affichera quelque chose comme ça: MAY 1, 2015 AT 12:00:00 AM GMT-4(lors de l'utilisation des { month: "long" }paramètres)
David M.
1
vous pouvez également obtenir la valeur par défaut en utilisantnew Date().toLocaleString(navigator.language, { month: "short" })
Remo H. Jansen
8

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

AzizStark
la source
7

Le format naturel de nos jours est d'utiliser Moment.js.

La façon d'obtenir le mois sous forme de chaîne est très simple dans Moment.js pas besoin de coder en dur les noms de mois dans votre code: Pour obtenir le mois et l'année en cours au format de nom de mois et l'année complète (mai 2015):

  moment(new Date).format("MMMM YYYY");
shacharsol
la source
avec moment déjà installé à d'autres fins, c'est la solution la plus simple.
Support CFP
1
Moment est une très grande bibliothèque, et beaucoup trop pour cela. Les alternatives modernes incluent Luxonet date-fns, mais là encore, il existe aujourd'hui un large support de navigateur pour l'API d'internationalisation .
Dan Dascalescu
7

Une autre façon de formater la date

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

Vous pouvez utiliser l'un des nombreux formats de date disponibles. Étant donné que cela relève de la spécification JavaScript, il sera disponible à la fois en mode navigateur et côté serveur.

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

par exemple

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

Il y en a plus sur https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

Dinesh
la source
4

Si vous ne souhaitez pas utiliser une bibliothèque externe, ou stocker un tableau de noms de mois, ou si l'API d'internationalisation ECMAScript n'est pas assez bonne en raison de la compatibilité du navigateur, vous pouvez toujours le faire à l'ancienne en extrayant les informations de la sortie de date:

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

Cela vous donnerait le nom abrégé du mois, par exemple octobre. Je pense que la date viendra dans toutes sortes de formats en fonction de l'initialisation et de vos paramètres régionaux, alors regardez ce qui toDateString()retourne et recalculez vos substring()valeurs en fonction de cela.

Matt K
la source
3

Si vous utilisez jQuery, vous utilisez probablement aussi jQuery UI, ce qui signifie que vous pouvez utiliser $ .datepicker.formatDate () .

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

Ma meilleure solution est la suivante:

       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
la source
me semble assez fragile ... et cela ne répond pas vraiment à la question du PO
David M.
1
Qu'est-ce qui en fait votre "meilleure solution"?
Dan Dascalescu
3

Avec momentjs , utilisez simplement la notation de format .

const myDate = new Date()
const shortMonthName = moment(myDate).format('MMM') // Aug
const fullMonthName = moment(myDate).format('MMMM') // August
lnmunhoz
la source
1
En plus de cet answe ayant déjà été donné 2 fois, momentc'est une très grande bibliothèque, et beaucoup trop pour cela. Les alternatives modernes incluent Luxonet date-fns, mais là encore, il existe aujourd'hui un large support de navigateur pour l'API d'internationalisation .
Dan Dascalescu
3

Cela peut également être fait si vous utilisez le kendo.

kendo.toString(dateobject, "MMMM");

Voici la liste des formateurs du site de kendo :

"d" Rend le jour du mois, de 1 à 31.

"dd" Le jour du mois, du 01 au 31.

"ddd" Le nom abrégé du jour de la semaine.

"dddd" Le nom complet du jour de la semaine.

"f" Les dixièmes de seconde dans une valeur de date et d'heure.

"ff" Les centièmes de seconde dans une valeur de date et d'heure.

"fff" Les millisecondes dans une valeur de date et d'heure.

"M" Le mois, de 1 à 12.

"MM" Le mois, de 01 à 12.

"MMM" Le nom abrégé du mois.

"MMMM" Le nom complet du mois.

"h" L'heure, en utilisant une horloge de 12 heures de 1 à 12.

"hh" L'heure, en utilisant une horloge de 12 heures de 01 à 12.

"H" L'heure, en utilisant une horloge de 24 heures de 1 à 23.

"HH" L'heure, en utilisant une horloge de 24 heures de 01 à 23.

"m" La minute, de 0 à 59.

"mm" La minute, de 00 à 59.

"s" Le second, de 0 à 59.

"ss" Le second, de 00 à 59.

"tt" Le désignateur AM / PM.

"yy" Les deux derniers caractères de la valeur de l'année.

"aaaa" L'année pleine valeur.

"zzz" Le fuseau horaire local lors de l'utilisation de formats pour analyser les chaînes de date UTC.

Navoneel Talukdar
la source
3

Vous pouvez simplement utiliser Date.toLocaleDateString () et analyser la date souhaitée comme paramètre

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

Vous pouvez trouver plus d'informations dans la documentation de Firefox

Andres Paul
la source
2

Si vous ne souhaitez pas utiliser le moment et souhaitez afficher le nom du mois -

.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
la source
2

Pour moi, c'est la meilleure solution,

pour TypeScript également

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 sortie est

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

Stockez les noms dans un tableau et recherchez l'index du mois.

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

JavaScript getMonth (), méthode

rahul
la source
22
Pourquoi ne pas var month = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ];? Bien plus court que de les ajouter individuellement ...
Fizzix
1

J'ai une solution partielle que j'ai trouvée. Il utilise une expression régulière pour extraire le nom du mois et du jour. Mais en parcourant les options Région et Langue (Windows), je me rends compte que différentes cultures ont un ordre de format différent ... peut-être qu'un meilleur modèle d'expression régulière pourrait être 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(","));
    }
Remus
la source
donc, au minimum cela fonctionne avec l'anglais et l'espagnol ... id suspect tout ce qui est le jour, la date du MOIS, l'année FORMAT
Remus
Je l'ai étudié un peu, je pense que pour avoir une solution vraiment indépendante de la langue, vous auriez besoin d'une expression régulière qui utilise des plages de caractères UNICODE. Les plages de caractères seraient différentes pour différents alphabets, donc je ne pense pas qu'il y aurait une taille unique pour tous les RegExp que nous pourrions utiliser.
Remus
0

En étendant simplement les nombreuses autres excellentes réponses - si vous utilisez jQuery - vous pouvez simplement faire quelque chose comme

$.fn.getMonthName = function(date) {

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

    return monthNames[date.getMonth()];

};

dateest égal au var d = new Date(somevalue). Le principal avantage de ceci est par @nickf dit d'éviter le namespace global.

Tim
la source
0

Pour obtenir un tableau de nom de mois:

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
la source
0

Écrivez simplement un simple wrapper 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
la source
0

Un hack rapide que j'ai utilisé et qui fonctionne 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
la source