Как я могу сгенерировать название месяца (например, октябрь / октябрь) из этого объекта даты в JavaScript?
var objDate = new Date("10/11/2009");
Как я могу сгенерировать название месяца (например, октябрь / октябрь) из этого объекта даты в JavaScript?
var objDate = new Date("10/11/2009");
Ответы:
Укороченная версия:
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 году, устарел. Смотрите ответ Дэвида Стори для лучшего решения.
new Date()возврат, Tue Sep 06 2011 20:02:25 GMT+0200 (CEST)который ясно означает, что объект Date уже имеет все это внутренне определенное (названия месяца и дня недели), он не является общедоступным, поэтому мы должны напечатать все это снова. :(
String#splitс toStringили toDateString.
Теперь это можно сделать с помощью интерфейса 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 .
Вот еще один, с поддержкой локализации :)
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: [...]};
Date.localeесть undefined. это отличный ответ для других реализаций JS!
Если вы не возражаете против расширения прототипа 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.
Я от всей души рекомендую 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
Используйте «ММММ» вместо «МММ», если вам нужно полное название месяца
В дополнение к длинному списку других функций, он имеет сильную поддержку интернационализации .
Luxonи date-fns, но опять же, в настоящее время широко поддерживается браузер для Интернационализации API в настоящее время .
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();
Это может сделать некоторый общий простой процесс из объекта даты.
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
Вы можете использовать datejs для этого. Проверьте FormatSpecifiers , MMMM дает вам название месяца:
var objDate = new Date("10/11/2009");
document.write(objDate.toString("MMMM"));
И datejs получил это локализованным для более чем 150 локалей! Посмотреть здесь
Пытаться:
var objDate = new Date("10/11/2009");
var strDate =
objDate.toLocaleString("en", { day: "numeric" }) + ' ' +
objDate.toLocaleString("en", { month: "long" }) + ' ' +
objDate.toLocaleString("en", { year: "numeric"});
Вот способ, который не зависит от жестко заданного массива и поддерживает несколько локалей.
Если вам нужен целый массив:
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
К сожалению, лучший способ извлечь название месяца из представления 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'
Вместо того, чтобы объявлять массив, который содержит все название месяца, а затем указывать с индексом, мы также можем записать его в более короткой версии, как показано ниже:
var objDate = new Date().toLocaleString("en-us", { month: "long" }); // result: August
var objDate = new Date().toLocaleString("en-us", { month: "short" }); // result: Aug
MAY 1, 2015 AT 12:00:00 AM GMT-4(при использовании { month: "long" }параметров)
new Date().toLocaleString(navigator.language, { month: "short" })
document.write(new Date().toLocaleString('en-us',{month:'long', year:'numeric', day:'numeric'}))
Естественным форматом в наши дни является использование Moment.js.
Способ получения месяца в строковом формате очень прост в Moment.js, не нужно жестко кодировать названия месяцев в своем коде: чтобы получить текущий месяц и год в формате названия месяца и полного года (май 2015 года):
moment(new Date).format("MMMM YYYY");
Luxonи date-fns, но опять же, в настоящее время широко поддерживается браузер для Интернационализации API в настоящее время .
Еще один способ форматирования даты
new Date().toLocaleString('en-us',{month:'long', year:'numeric', day:'numeric'}) //output: "May 21, 2019"
Вы можете использовать один из нескольких доступных форматеров даты. Поскольку это входит в спецификацию 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
Если вы не хотите использовать внешнюю библиотеку или хранить массив названий месяцев, или если API интернационализации ECMAScript недостаточно хорош из-за совместимости с браузером, вы всегда можете сделать это старомодным способом, извлекая информацию из дата выхода:
var now = new Date();
var monthAbbrvName = now.toDateString().substring(4, 7);
Это даст вам сокращенное название месяца, например, октябрь. Я полагаю, что дата придет во всевозможных форматах в зависимости от инициализации и вашей локали, поэтому взгляните на то, что toDateString()возвращает, и пересчитайте ваши substring()значения на основе этого.
Если вы используете jQuery, вы, вероятно, также используете jQuery UI, что означает, что вы можете использовать $ .datepicker.formatDate () .
$.datepicker.setDefaults( $.datepicker.regional[ "nl" ] ); // dutch
$.datepicker.formatDate( "dd MM yy", objDate );
Мое лучшее решение заключается в следующем:
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;
С моментами просто используйте формат записи.
const myDate = new Date()
const shortMonthName = moment(myDate).format('MMM') // Aug
const fullMonthName = moment(myDate).format('MMMM') // August
momentявляется очень большой библиотекой, и это слишком излишне . Современные альтернативы включают Luxonи date-fns, но опять же, в настоящее время широко поддерживается браузер для Интернационализации API в настоящее время .
Это также можно сделать, если вы используете кендо.
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.
Вы можете просто использовать 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
Если вы не хотите использовать момент и хотите отобразить название месяца -
.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;
}
};
}
Для меня это лучшее решение,
а также для 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"]
Храните имена в массиве и ищите по индексу месяца.
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()]);
var month = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ];? Гораздо короче, чем добавление их по отдельности ...
У меня есть частичное решение, которое я придумал. Он использует регулярное выражение для извлечения названия месяца и дня. Но когда я просматриваю «Регион» и «Язык» (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(","));
}
Просто распространяясь на многие другие отличные ответы - если вы используете 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 говорит о том, что нужно избегать глобального пространства имен.
Чтобы получить массив названий месяцев:
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
Просто напишите простую обертку вокруг 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));
Быстрый взлом, который я использовал, который работает хорошо:
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);