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.