Получить название месяца от даты


673

Как я могу сгенерировать название месяца (например, октябрь / октябрь) из этого объекта даты в JavaScript?

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

Было бы неплохо, если бы можно было использовать stackoverflow.com/a/18648314/5846045 , чтобы помочь будущим читателям лучше ответить
Boghyon Hoffmann

Ответы:


1140

Укороченная версия:

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

Примечание (2019-03-08) - этот ответ, который я написал в 2009 году, устарел. Смотрите ответ Дэвида Стори для лучшего решения.


401
это немного расстраивает, что даже имея new Date()возврат, Tue Sep 06 2011 20:02:25 GMT+0200 (CEST)который ясно означает, что объект Date уже имеет все это внутренне определенное (названия месяца и дня недели), он не является общедоступным, поэтому мы должны напечатать все это снова. :(
Занона

9
Не идеальное решение, если нужно включать названия месяцев для каждого поддерживаемого языка. Должен быть лучший способ использования String#splitс toStringили toDateString.
Райан

23
несколько языков = многомерный массив;) translations ["monthName"] [currentLanguage] [d.getMonth ()]
нуала

25
@ zanona - объект даты не обязательно имеет «все это внутренне определенное». Все, что требуется в ECMA-262 - это значение времени , которое является числом. То, что вы видите, является результатом Date.prototype.toString , который зависит от реализации.
RobG

9
@Devin, но это перераспределяет массив каждый раз, когда вы хотите получить к нему доступ.
Коул Джонсон

778

Теперь это можно сделать с помощью интерфейса ECMAScript Internationalization API:

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

'long'использует полное название месяца, 'short'короткое имя и 'narrow'более минимальную версию, например первую букву в алфавитных языках.

Вы можете поменять локаль с браузера 'default'на любую, какую пожелаете (например 'en-us'), и она будет использовать правильное название для этого языка / страны.

С toLocaleStringAPI вы должны передать в локали и варианты каждый раз. Если вы собираетесь использовать одну и ту же информацию о локали и параметры форматирования для нескольких разных дат, вы можете использовать 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".

Для получения дополнительной информации см. Мой пост в блоге об Интернационализации API .


1
Я могу подтвердить, что Safari Technology Preview имеет поддержку для этого. Я думаю, что должен быть принят ответ
Салман Хасрат Хан

1
Работает в узле тоже!
mikemaccana

4
Отличное решение, но для моего варианта использования это оказалось слишком медленным. Я обрабатывал несколько сотен предметов, и это составляло в среднем около 1 мс на предмет, чтобы получить месяц и год (хром, сафари). В итоге я принял принятый ответ, но только потому, что он работал намного лучше. Это был бы мой предпочтительный метод, если бы мне нужно было вызывать его только несколько раз.
т.888

7
Теперь это поддерживается в большинстве браузеров: caniuse.com/#search=intl
eyal83

2
Обратите внимание на React Native, это работает для устройств iOS, но в Android оно отображается некорректно (просто выплевывает всю метку времени).
Хардангер

162

Вот еще один, с поддержкой локализации :)

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

Вы можете легко добавить поддержку других языков:

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

2
Обратите внимание, что это не будет работать на узле с 6.x как Date.localeесть undefined. это отличный ответ для других реализаций JS!
mikemaccana

Это может иметь смысл, если локализованные массивы имен были созданы с использованием Date.prototype.toLocaleString . Кроме того, расширение встроенных прототипов и объектов не считается хорошей идеей.
RobG

62

Если вы не возражаете против расширения прототипа Date (и есть некоторые веские причины не хотеть этого делать), вы можете придумать очень простой метод:

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"

Эти функции будут применяться ко всем объектам Date в JavaScript.


6
«и есть несколько веских причин не хотеть этого делать». Просто любопытно: какие причины вы имеете в виду?
KooiInc

13
@Kooilnc: Это потому, что вы работаете в глобальном пространстве. Если вы импортируете чужие функции или библиотеки, которые тоже это делают, они могут перезаписывать друг друга.
Nickf

61

Я от всей души рекомендую formatфункцию из библиотеки moment.js , которую вы можете использовать следующим образом:

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

Используйте «ММММ» вместо «МММ», если вам нужно полное название месяца

В дополнение к длинному списку других функций, он имеет сильную поддержку интернационализации .


2
Первый из них приведет к «апрелю». «MMM» показывает первые три буквы месяца, если вы хотите, чтобы полное имя использовалось вместо «MMMM». Смотрите их документацию для помощи.
Томнар

Если вы идете по пути интенсивной оптимизации и сокращения HTTP-запросов, это может быть не вариант для вас. Вместо этого придерживайтесь только использования массива названий месяцев, если вы собираетесь форматировать названия месяцев только в одной строке кода.
OzzyTheGiant

3
Момент - очень большая библиотека, и путь к этому слишком велик. Современные альтернативы включают Luxonи date-fns, но опять же, в настоящее время широко поддерживается браузер для Интернационализации API в настоящее время .
Дан Даскалеску

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

Может использоваться как

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

18

Это может сделать некоторый общий простой процесс из объекта даты.

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

Или вы можете сделать прототип даты как

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

Пример:

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

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


2
Спасибо! Я пока не понимаю прототипы, но я с нетерпением жду возможности попробовать.
Эрик Хепперле - CodeSlayer2010


12

Пытаться:

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

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

Это сработало зимой 2017 года! Использование «en-us», как предлагали другие пользователи, примерно 3 года назад, не работает в Chrome.
Эрик Хепперл - CodeSlayer2010

9

Вот способ, который не зависит от жестко заданного массива и поддерживает несколько локалей.

Если вам нужен целый массив:

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

Применение:

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

Если вам нужен только выбранный месяц (быстрее):

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

Применение:

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

Протестировано и отлично работает на Chrome и IE 11. На Mozilla необходимы некоторые модификации, потому что он возвращает всю дату.


Это не будет работать даже в сафари. Из-заtoLocaleString
Сергей Панфилов

8

К сожалению, лучший способ извлечь название месяца из представления 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

Вместо того, чтобы объявлять массив, который содержит все название месяца, а затем указывать с индексом, мы также можем записать его в более короткой версии, как показано ниже:

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

обратите внимание, что это не работает надежно во всех браузерах ... Safari (мобильный и рабочий стол) будет выводить что-то вроде этого: MAY 1, 2015 AT 12:00:00 AM GMT-4(при использовании { month: "long" }параметров)
David M.

1
Вы также можете получить значение по умолчанию, используяnew Date().toLocaleString(navigator.language, { month: "short" })
Remo H. Jansen


7

Естественным форматом в наши дни является использование Moment.js.

Способ получения месяца в строковом формате очень прост в Moment.js, не нужно жестко кодировать названия месяцев в своем коде: чтобы получить текущий месяц и год в формате названия месяца и полного года (май 2015 года):

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

с моментом, уже установленным для других целей, это самое простое решение.
Поддержка CFP

1
Момент - очень большая библиотека, и путь к этому слишком велик. Современные альтернативы включают Luxonи date-fns, но опять же, в настоящее время широко поддерживается браузер для Интернационализации API в настоящее время .
Дан Даскалеску

7

Еще один способ форматирования даты

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

6

Вы можете использовать один из нескольких доступных форматеров даты. Поскольку это входит в спецификацию JavaScript, оно будет доступно как в браузерном, так и в серверном режимах.

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

например

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

Есть и другие на https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date


4

Если вы не хотите использовать внешнюю библиотеку или хранить массив названий месяцев, или если API интернационализации ECMAScript недостаточно хорош из-за совместимости с браузером, вы всегда можете сделать это старомодным способом, извлекая информацию из дата выхода:

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

Это даст вам сокращенное название месяца, например, октябрь. Я полагаю, что дата придет во всевозможных форматах в зависимости от инициализации и вашей локали, поэтому взгляните на то, что toDateString()возвращает, и пересчитайте ваши substring()значения на основе этого.


3

Если вы используете jQuery, вы, вероятно, также используете jQuery UI, что означает, что вы можете использовать $ .datepicker.formatDate () .

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

3

Мое лучшее решение заключается в следующем:

       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;

кажется мне довольно хрупким ... и это на самом деле не отвечает на вопрос ОП
Дэвид М.

1
Что делает это вашим «лучшим решением»?
Дан Даскалеску

3

С моментами просто используйте формат записи.

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

1
Кроме того, этот ответ, который был дан уже 2 раза, momentявляется очень большой библиотекой, и это слишком излишне . Современные альтернативы включают Luxonи date-fns, но опять же, в настоящее время широко поддерживается браузер для Интернационализации API в настоящее время .
Дан Даскалеску

3

Это также можно сделать, если вы используете кендо.

kendo.toString(dateobject, "MMMM");

Вот список форматеров с сайта кендо :

«d» Отображает день месяца с 1 по 31.

«дд» день месяца с 01 по 31.

"ddd" Сокращенное название дня недели.

"dddd" Полное название дня недели.

"f" Десятые доли секунды в значении даты и времени.

"ff" Сотые доли секунды в значении даты и времени.

"fff" Миллисекунды в значении даты и времени.

«М» Месяц с 1 по 12.

«ММ» Месяц с 01 по 12.

«МММ» Сокращенное название месяца.

«ММММ» Полное название месяца.

«h» Час, используя 12-часовые часы от 1 до 12.

«чч» час, используя 12-часовые часы с 01 по 12.

«H» Час, используя 24-часовые часы от 1 до 23.

«ЧЧ» Час, используя 24-часовые часы с 01 по 23.

«м» минута от 0 до 59.

«мм» минута с 00 до 59.

"s" Второй, от 0 до 59.

«сс» второй, с 00 по 59.

"tt" Обозначение AM / PM.

"уу" последние два символа значения года.

"гггг" Год полной стоимости.

"zzz" Местный часовой пояс при использовании форматов для разбора строк даты UTC.


3

Вы можете просто использовать Date.toLocaleDateString () и проанализировать требуемую дату в качестве параметра

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

Вы можете найти больше информации в документации Firefox


2

Если вы не хотите использовать момент и хотите отобразить название месяца -

.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

Для меня это лучшее решение,

а также для 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;
};

Выход

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

1

Храните имена в массиве и ищите по индексу месяца.

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 () метод


22
Почему нет var month = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ];? Гораздо короче, чем добавление их по отдельности ...
Fizzix

1

У меня есть частичное решение, которое я придумал. Он использует регулярное выражение для извлечения названия месяца и дня. Но когда я просматриваю «Регион» и «Язык» (Windows), я понимаю, что разные культуры имеют разный порядок форматирования ... может быть, лучше использовать шаблон регулярного выражения.

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

так, минимально это работает с английским и испанским языками ... id подозревает что-либо, что является ДЕНЬ, МЕСЯЦ, дата ФОРМАТ
Remus

Я немного разбирался в этом, я думаю, что для решения, не зависящего от языка, вам нужно иметь регулярное выражение, использующее диапазоны символов UNICODE. Диапазоны символов будут разными для разных алфавитов, поэтому я не думаю, что будет один размер, подходящий для всех RegExp, которые мы могли бы использовать.
Ремус

0

Просто распространяясь на многие другие отличные ответы - если вы используете jQuery - вы можете просто сделать что-то вроде

$.fn.getMonthName = function(date) {

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

    return monthNames[date.getMonth()];

};

где dateравно var d = new Date(somevalue). Основное преимущество этого в per @nickf говорит о том, что нужно избегать глобального пространства имен.


0

Чтобы получить массив названий месяцев:

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

Просто напишите простую обертку вокруг 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

Быстрый взлом, который я использовал, который работает хорошо:

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.