Uzyskaj nazwę miesiąca od daty


Odpowiedzi:


1136

Krótsza wersja:

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

Uwaga (2019-03-08) - Ta odpowiedź, którą pierwotnie napisałem w 2009 roku, jest nieaktualna. Zobacz odpowiedź Davida Storeya na lepsze rozwiązanie.


401
nieco frustrujące jest to, że nawet new Date()powrót, Tue Sep 06 2011 20:02:25 GMT+0200 (CEST)co wyraźnie oznacza, że ​​obiekt Date ma już wszystkie te wewnętrznie zdefiniowane (nazwy dni miesiąca i tygodnia), nie jest publiczny, więc musimy to wszystko wpisać ponownie. :(
zanona

9
Nie jest to idealne rozwiązanie, jeśli trzeba podać nazwy miesięcy dla każdego obsługiwanego języka. Musi być lepszy sposób korzystania String#splitz toStringlub toDateString.
Ryan

23
wiele języków = tablica wielowymiarowa;) tłumaczenia ["monthName"] [currentLanguage] [d.getMonth ()]
nuala

25
@ zanona - obiekt daty niekoniecznie ma „wszystko to wewnętrznie zdefiniowane”. W ECMA-262 wymagana jest jedynie wartość czasu , która jest liczbą. To, co widzisz, jest wynikiem Date.prototype.toString , który jest zależny od implementacji.
RobG

9
@Devin, ale przenosi tablicę za każdym razem, gdy chcesz uzyskać do niej dostęp.
Cole Johnson

776

Teraz można to zrobić za pomocą interfejsu API internacjonalizacji ECMAScript:

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

'long'używa pełnej nazwy miesiąca, 'short'skrótu i 'narrow'bardziej minimalnej wersji, takiej jak pierwsza litera w językach alfabetycznych.

Możesz zmienić ustawienia regionalne z przeglądarki na 'default'dowolne (np. 'en-us'), A użyje ono właściwej nazwy dla tego języka / kraju.

Za pomocą toLocaleStringinterfejsu API musisz za każdym razem podawać ustawienia regionalne i opcje. Jeśli zamierzasz korzystać z tych samych informacji regionalnych i opcji formatowania w wielu różnych datach, możesz Intl.DateTimeFormatzamiast tego użyć :

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

Aby uzyskać więcej informacji, zobacz mój post na blogu dotyczący interfejsu API internacjonalizacji .


1
Mogę potwierdzić, że przegląd technologii Safari obsługuje to. Myślę, że powinna być przyjęta odpowiedź
Salman Hasrat Khan

1
Działa również w węźle!
mikemaccana

4
Świetne rozwiązanie, ale w moim przypadku było to zbyt wolne. Przetwarzałem kilkaset pozycji i średnio otrzymywałem około 1 ms na sztukę, aby uzyskać zarówno miesiąc, jak i rok (chrom, safari). Ostatecznie użyłem zaakceptowanej odpowiedzi, ale tylko dlatego, że działała znacznie lepiej. To byłaby moja preferowana metoda, gdybym musiał ją wywołać tylko kilka razy.
t.888,

7
To jest teraz obsługiwane w większości przeglądarek: caniuse.com/#search=intl
eyal83

2
Uwaga na temat React Native działa to na urządzeniach z iOS, ale na Androidzie wyświetla się niepoprawnie (po prostu wypluwa cały znacznik czasu).
hardanger

162

Oto kolejny, z obsługą lokalizacji :)

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

możesz łatwo dodać obsługę innych języków:

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

2
Zauważ, że to nie będzie działać na węźle od 6.x jak Date.localejest undefined. jest to jednak doskonała odpowiedź na inne implementacje JS!
mikemaccana

Może to mieć sens, jeśli zlokalizowane tablice nazw zostały zbudowane przy użyciu Date.prototype.toLocaleString . Ponadto rozszerzanie wbudowanych prototypów i obiektów nie jest uważane za dobry pomysł.
RobG

62

Jeśli nie masz nic przeciwko rozszerzeniu prototypu Data (i istnieją dobre powody, aby tego nie chcieć), możesz naprawdę wymyślić bardzo łatwą metodę:

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"

Funkcje te zostaną następnie zastosowane do wszystkich obiektów Date javascript.


6
„i istnieją dobre powody, aby tego nie chcieć”. Ciekawe: jakie masz na myśli powody?
KooiInc,

13
@Kooilnc: To dlatego, że zasadniczo pracujesz w przestrzeni globalnej. Jeśli zaimportujesz funkcje lub biblioteki innej osoby, które również to robią, mogą się one wzajemnie nadpisywać.
nickf

61

Polecam serdecznie formatfunkcję z biblioteki moment.js , której można użyć w następujący sposób:

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

Użyj „MMMM” zamiast „MMM”, jeśli potrzebujesz pełnej nazwy miesiąca

Oprócz długiej listy innych funkcji, ma silne wsparcie dla internacjonalizacji .


2
Pierwszy z nich spowodowałby „Apr”. „MMM” pokazuje pierwsze trzy litery miesiąca, jeśli chcesz, aby pełna nazwa zawierała „MMMM”. Aby uzyskać pomoc, zapoznaj się z ich dokumentacją .
Tomnar

Jeśli wybierasz się na ciężką optymalizację i redukujesz żądania HTTP, może to nie być dla Ciebie rozwiązaniem. Zamiast tego trzymaj się tylko używania tablicy nazw miesięcy, jeśli zamierzasz formatować nazwy miesięcy tylko w jednym wierszu kodu.
OzzyTheGiant

3
Moment jest bardzo dużą biblioteką i jest do tego zbyt przesadny. Nowoczesne alternatywy obejmują Luxoni date-fns, ale potem znowu, istnieje szerokie poparcie dla umiędzynarodowienia przeglądarka API w dzisiejszych czasach .
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()];
}

Może być używany jako

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

18

Dzięki temu można wykonać niektóre typowe proste procesy od daty.

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

Lub możesz zrobić prototyp daty

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

Dawny:

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

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


2
Dzięki! Nie rozumiem jeszcze prototypów, ale nie mogę się doczekać, aby spróbować.
Eric Hepperle - CodeSlayer2010


12

Próbować:

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

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

Działało to w zimie 2017 roku! Używanie „en-us”, jak sugerują inni użytkownicy około 3 lata wcześniej, nie działa w Chrome.
Eric Hepperle - CodeSlayer2010

9

Oto sposób, który nie zależy od tablicy zakodowanej na stałe i obsługuje wiele ustawień narodowych.

Jeśli potrzebujesz całej tablicy:

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

Stosowanie:

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

Jeśli potrzebujesz tylko wybranego miesiąca (szybciej):

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

Stosowanie:

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

Przetestowane i działa dobrze w Chrome i IE 11. Na mozilli potrzebne są pewne modyfikacje, ponieważ zwraca całą datę.


To nie zadziała jeszcze nawet w bezpieczny sposób. Z powodutoLocaleString
Siergieja Panfiłowa

8

Niestety najlepszym sposobem na wyodrębnienie nazwy miesiąca jest reprezentacja 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

Zamiast deklarować tablicę, która zawiera całą nazwę miesiąca, a następnie wskazuje indeks, możemy również napisać ją w krótszej wersji, jak poniżej:

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

należy pamiętać, że nie działa to niezawodnie w różnych przeglądarkach ... Safari (mobilne i stacjonarne) wyświetli coś takiego: MAY 1, 2015 AT 12:00:00 AM GMT-4(przy użyciu { month: "long" }parametrów)
David M.

1
domyślny można również uzyskać za pomocąnew Date().toLocaleString(navigator.language, { month: "short" })
Remo H. Jansen


7

Naturalnym formatem w tych dniach jest użycie Moment.js.

Sposób, aby uzyskać miesiąc w formacie ciągu, jest bardzo prosty w Moment.js, nie trzeba sztywno kodować nazw miesięcy w kodzie: Aby uzyskać bieżący miesiąc i rok w formacie nazwy miesiąca i cały rok (maj 2015):

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

z chwilą już zainstalowaną do innych celów, jest to najprostsze rozwiązanie.
Wsparcie CFP

1
Moment jest bardzo dużą biblioteką i jest do tego zbyt przesadny. Nowoczesne alternatywy obejmują Luxoni date-fns, ale potem znowu, istnieje szerokie poparcie dla umiędzynarodowienia przeglądarka API w dzisiejszych czasach .
Dan Dascalescu,

7

Inny sposób formatowania daty

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

6

Możesz użyć jednego z kilku dostępnych formatów daty. Ponieważ jest to zgodne ze specyfikacją JavaScript, będzie dostępne zarówno w trybie przeglądarki, jak i po stronie serwera.

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

na przykład

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

Więcej na https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date


4

Jeśli nie chcesz korzystać z zewnętrznej biblioteki lub przechowywać tablicy nazw miesięcy, lub jeśli interfejs API internacjonalizacji ECMAScript nie jest wystarczająco dobry z powodu kompatybilności z przeglądarką, zawsze możesz to zrobić w staromodny sposób, wyodrębniając informacje z wyjście daty:

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

Dałoby to skróconą nazwę miesiąca, np. Październik. Wierzę, że data nadejdzie we wszystkich formatach w zależności od inicjalizacji i ustawień regionalnych, więc spójrz na to, co toDateString()zwraca, i ponownie oblicz substring()wartości na tej podstawie.


3

Jeśli używasz jQuery, prawdopodobnie używasz również jQuery UI, co oznacza, że ​​możesz użyć $ .datepicker.formatDate () .

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

3

Moje najlepsze rozwiązanie jest następujące:

       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;

wydaje mi się dość krucha ... i tak naprawdę nie odpowiada na pytanie OP
David M.

1
Co sprawia, że ​​jest to „najlepsze rozwiązanie”?
Dan Dascalescu,

3

W chwili , po prostu użyj zapisu formatu .

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

1
Poza tym, że ta odpowiedź została już podana 2 razy, momentjest to bardzo duża biblioteka i jest do tego zbyt przesadna. Nowoczesne alternatywy obejmują Luxoni date-fns, ale potem znowu, istnieje szerokie poparcie dla umiędzynarodowienia przeglądarka API w dzisiejszych czasach .
Dan Dascalescu,

3

Można to również zrobić, jeśli używasz kendo.

kendo.toString(dateobject, "MMMM");

Oto lista formatów ze strony kendo :

„d” Renderuje dzień miesiąca, od 1 do 31.

„dd” Dzień miesiąca, od 01 do 31.

„ddd” Skrócona nazwa dnia tygodnia.

„dddd” Pełna nazwa dnia tygodnia.

„f” Dziesiąte sekundy wartości daty i godziny.

„ff” Setne części sekundy w wartości daty i godziny.

„fff” Milisekundy w wartości daty i godziny.

„M” Miesiąc, od 1 do 12.

„MM” Miesiąc, od 01 do 12.

„MMM” Skrócona nazwa miesiąca.

„MMMM” Pełna nazwa miesiąca.

„h” Godzina, przy użyciu zegara 12-godzinnego od 1 do 12.

„hh” Godzina, przy użyciu 12-godzinnego zegara od 01 do 12.

„H” Godzina, przy użyciu 24-godzinnego zegara od 1 do 23.

„GG” Godzina, przy użyciu 24-godzinnego zegara od 01 do 23.

„m” Minuta, od 0 do 59.

„mm” Minuta, od 00 do 59.

„s” Drugi, od 0 do 59.

„ss” drugi, od 00 do 59.

„tt” Oznacznik AM / PM.

„yy” Ostatnie dwa znaki z wartości roku.

„rrrr” Pełna wartość roku.

„zzz” Lokalna strefa czasowa przy użyciu formatów do analizowania ciągów dat UTC.


3

Możesz po prostu użyć Date.toLocaleDateString () i przeanalizować żądaną datę jako parametr

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

Więcej informacji można znaleźć w dokumentacji Firefoksa


2

Jeśli nie chcesz użyć chwili i chcesz wyświetlić nazwę miesiąca -

.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

Dla mnie to najlepsze rozwiązanie to

również dla 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;
};

Dane wyjściowe to

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

1

Przechowuj nazwy w tablicy i wyszukaj według indeksu miesiąca.

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


22
Dlaczego nie var month = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ];? Znacznie krócej niż dodawanie ich pojedynczo ...
Fizzix

1

Mam częściowe rozwiązanie, które wymyśliłem. Do wyodrębnienia nazwy miesiąca i dnia używa wyrażenia regularnego. Ale kiedy przeglądam opcje Region i język (Windows), zdaję sobie sprawę, że różne kultury mają różną kolejność formatów ... może lepszy może być lepszy wzorzec wyrażeń regularnych.

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

więc minimalnie działa z językiem angielskim i hiszpańskim ... nie podejrzewam niczego, co jest DZIEŃ, MIESIĄC data, rok FORMAT
Remus

Trochę się temu przyjrzałem, myślę, że aby mieć prawdziwie niezależne od języka rozwiązanie, potrzebne byłoby wyrażenie regularne korzystające z zakresów znaków UNICODE. Zakresy znaków byłyby różne dla różnych alfabetów, więc nie sądzę, by byłby jeden rozmiar pasujący do wszystkich RegExp, których moglibyśmy użyć.
Remus,

0

Po prostu rozszerzając wiele innych doskonałych odpowiedzi - jeśli używasz jQuery - możesz po prostu zrobić coś takiego

$.fn.getMonthName = function(date) {

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

    return monthNames[date.getMonth()];

};

gdzie datejest równe var d = new Date(somevalue). Główną zaletą tego jest to, że per @nickf powiedział o unikaniu globalnej przestrzeni nazw.


0

Aby uzyskać tablicę nazw miesięcy:

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

Wystarczy napisać proste opakowanie 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

Szybki hack, którego użyłem, który działa dobrze:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.