Отримайте назву місяця від дати


672

Як я можу генерувати назву місяця (наприклад: жовтень / жовтень) з цього об’єкта дати в JavaScript?

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

Було б добре, якби stackoverflow.com/a/18648314/5846045 можна було б прийняти, щоб скеровувати майбутніх читачів до кращої відповіді
Boghyon Hoffmann

Відповіді:


1136

Коротша версія:

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 вже має все це внутрішньо визначено (імена днів місяця та тижня), це не є загальнодоступним, тому нам доведеться все це набрати знову. :(
zanona

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

23
кілька мов = багатовимірний масив;) переклади ["monthName"] [currentLanguage] [d.getMonth ()]
nuala

25
@ zanona - об’єкт дати не обов'язково має "все це визначено внутрішньо". Все, що потрібно в ECMA-262, - це значення часу , яке є числом. Те, що ви бачите, є результатом Date.prototype.toString , який залежить від реалізації.
RobG

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

776

Тепер це можна зробити за допомогою інтернаціоналізації API ECMAScript:

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 він відображається неправильно (просто розплітає всю часову позначку).
hardanger

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"

Ці функції потім застосовуватимуться до всіх об’єктів дати 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

Використовуйте "MMMM" замість "MMM", якщо вам потрібно повне найменування місяця

Окрім тривалого переліку інших особливостей, він має сильну підтримку інтернаціоналізації .


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.
Eric Hepperle - 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. У мозіллі потрібні деякі зміни, оскільки вона повертає всю дату.


Це ще не спрацює навіть у сафарі. Через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" })
Ремо Х. Янсен,


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, що означає, що ви можете використовувати $ .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");

Ось перелік форматів з сайту kendo :

"d" Відображає день місяця, з 1 по 31.

"дд" День місяця, з 01 по 31 рік.

"ddd" Скорочена назва дня тижня.

"dddd" Повна назва дня тижня.

"f" Десяті секунди у значенні дати та часу.

"ff" Соті секунди у значенні дати та часу.

"fff" Мілісекунд у значенні дати та часу.

"М" Місяць, з 1 по 12.

"ММ" Місяць, з 01 по 12 рік.

"MMM" Скорочена назва місяця.

"MMMM" Повна назва місяця.

"h" Година, використовуючи 12-годинний годинник від 1 до 12.

"hh" Година, використовуючи 12-годинний годинник від 01 до 12.

"H" Година, використовуючи цілодобовий годинник від 1 до 23.

"НН" Година, використовуючи цілодобовий годинник з 01 по 23 години.

"м" Хвилина, від 0 до 59.

"мм" Хвилина, з 00 по 59.

"s" Другий, від 0 до 59.

"ss" Другий, з 00 по 59.

"tt" Позначник AM / PM.

"yy" Останні два символи зі значенням року.

"yyyy" Повна вартість року.

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

так, мінімально, це працює з англійською та іспанською мовами ... підозрюю, що в цьому є щоденний день, дата місяця, рік ФОРМАТ
Ремус

Я трохи переглянув це, я думаю, щоб мати справді незалежне від мови рішення, вам потрібно мати регулярний вираз, який використовує діапазони символів 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). Основна перевага цього полягає в тому, що в @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.