Zauważyłem, że new Date()
funkcja JavaScript jest bardzo inteligentna w przyjmowaniu dat w kilku formatach.
Xmas95 = new Date("25 Dec, 1995 23:15:00")
Xmas95 = new Date("2009 06 12,12:52:39")
Xmas95 = new Date("20 09 2006,12:52:39")
Nigdzie nie mogłem znaleźć dokumentacji pokazującej wszystkie prawidłowe formaty ciągów podczas wywoływania new Date()
funkcji.
Służy do konwertowania ciągu na datę. Jeśli spojrzymy na przeciwną stronę, czyli konwersję obiektu daty na ciąg, do tej pory miałem wrażenie, że JavaScript nie ma wbudowanego API do formatowania obiektu daty na ciąg.
Nota redaktora: Poniższe podejście jest próbą osoby pytającej, która działała w określonej przeglądarce, ale ogólnie nie działa; zobacz odpowiedzi na tej stronie, aby zobaczyć niektóre rzeczywiste rozwiązania.
Dzisiaj grałem toString()
metodą na obiekcie date i, co zaskakujące, służy ona formatowaniu daty na ciągi.
var d1 = new Date();
d1.toString('yyyy-MM-dd'); //Returns "2009-06-29" in Internet Explorer, but not Firefox or Chrome
d1.toString('dddd, MMMM ,yyyy') //Returns "Monday, June 29,2009" in Internet Explorer, but not Firefox or Chrome
Również tutaj nie mogłem znaleźć żadnej dokumentacji dotyczącej wszystkich sposobów formatowania obiektu daty na ciąg.
Gdzie jest dokumentacja zawierająca specyfikatory formatu obsługiwane przez Date()
obiekt?
źródło
Odpowiedzi:
Uwielbiam 10 sposobów formatowania godziny i daty za pomocą JavaScript i pracy z .
Zasadniczo masz trzy metody i musisz sam połączyć łańcuchy:
Przykład:
źródło
Moment.js
Jest to (lekka) * biblioteka dat JavaScript do parsowania, manipulowania i formatowania dat.
(*) lekki, co oznacza 9,3 KB zminimalizowane + gzip w najmniejszej możliwej konfiguracji (luty 2014)
źródło
Jeśli już używasz interfejsu użytkownika jQuery w swoim projekcie, możesz użyć wbudowanej metody datepicker do sformatowania obiektu daty:
Jednak datepicker formatuje tylko daty i nie może formatować godzin.
Spójrz na format datepicker jQuery UI , przykłady.
źródło
Natknąłem się na to dzisiaj i byłem dość zaskoczony, że nikt nie miał czasu odpowiedzieć na to proste pytanie. To prawda, istnieje wiele bibliotek, które pomagają w manipulowaniu datami. Niektóre są lepsze od innych. Ale to nie było pytanie.
AFAIK, czysty JavaScript nie obsługuje specyfikatorów formatu w sposób, w jaki wskazałeś, że chcesz ich używać . Ale robi metod wsparcia dla formatowania daty i / lub czasu, takich jak
.toLocaleDateString()
,.toLocaleTimeString()
i.toUTCString()
.Date
Odwołanie do obiektu używam najczęściej znajduje się na stronie internetowej w3schools.com (ale szybkiego wyszukiwania Google ujawni wiele innych, które mogą lepiej swoich potrzeb).Należy również pamiętać, że sekcja Właściwości obiektu daty zawiera link do
prototype
, który ilustruje niektóre sposoby rozszerzenia obiektu Date za pomocą metod niestandardowych. Przez lata w społeczności JavaScript toczyła się debata na temat tego, czy jest to najlepsza praktyka, i nie opowiadam się za nią, czy przeciw niej, tylko wskazując na jej istnienie.źródło
Niestandardowa funkcja formatowania:
W przypadku formatów ustalonych wystarczy prosta funkcja. Poniższy przykład wygeneruje międzynarodowy format RRRR-MM-DD:
Uwaga: Jednak zwykle nie jest dobrym pomysłem rozszerzenie standardowych bibliotek Javascript (np. Poprzez dodanie tej funkcji do prototypu Date).
Bardziej zaawansowana funkcja może generować konfigurowalne dane wyjściowe na podstawie parametru formatu. Na tej samej stronie znajduje się kilka dobrych przykładów.
Jeśli napisanie funkcji formatowania jest zbyt długie, istnieje wiele bibliotek wokół niej. Niektóre inne odpowiedzi już je wymieniają. Ale rosnące zależności mają również swoje odpowiedniki.
Standardowe funkcje formatowania ECMAScript:
Od nowszych wersji ECMAscript
Date
klasa ma pewne specyficzne funkcje formatowania:Uwaga: możliwe jest wygenerowanie niestandardowego wyjścia z tych funkcji formatowania:
źródło
Krótka odpowiedź
Nie ma „uniwersalnej” dokumentacji, do której javascript mógłby się dostosować; każda przeglądarka z javascript jest naprawdę implementacją. Istnieje jednak standard, który jest zgodny z większością współczesnych przeglądarek, a jest to standard EMCAScript; standardowe ciągi znaków ECMAScript wymagałyby minimalnie zmodyfikowanej implementacji definicji ISO 8601.
Oprócz tego IETF przedstawia drugi standard , który są również stosowane przez przeglądarki, czyli definicję znaczników czasu wykonanych w RFC 2822. Rzeczywistą dokumentację można znaleźć na liście odnośników na dole.
Po tym można oczekiwać podstawowej funkcjonalności, ale to, co „powinno” być, nie jest z natury tym, co „jest”. Zagłębię się nieco w to proceduralnie, ponieważ wydaje się, że tylko trzy osoby faktycznie odpowiedziały na pytanie (Scott, goofballLogic i peller mianowicie), co, według mnie, sugeruje, że większość ludzi nie wie, co tak naprawdę się dzieje, gdy ty utwórz obiekt Date.
Długa odpowiedź
Aby odpowiedzieć na pytanie lub zazwyczaj poszukać odpowiedzi na to pytanie, musisz wiedzieć, że javascript nie jest nowym językiem; w rzeczywistości jest to implementacja ECMAScript i jest zgodna ze standardami ECMAScript (ale uwaga, javascript również faktycznie był wcześniejszy niż te standardy; standardy EMCAScript są zbudowane na podstawie wczesnej implementacji LiveScript / JavaScript). Obecny standard ECMAScript to 5.1 (2011); w momencie, gdy pytanie zostało pierwotnie zadane (czerwiec 2009 r.), standardem było 3 (4 zostało porzucone), ale 5 zostało wydane wkrótce po stanowisku pod koniec 2009 r. Powinno to nakreślić jeden problem; jaki standard może stosować implementacja javascript, może nie odzwierciedlać tego, co faktycznie istnieje, ponieważ a) jest implementacją danego standardu, b) nie wszystkie implementacje standardu są purytanami,
Zasadniczo, mając do czynienia z javascript, masz do czynienia z pochodną (javascript specyficzną dla przeglądarki) implementacji (sam javascript). Na przykład Google V8 implementuje ECMAScript 5.0, ale JScript programu Internet Explorer nie próbuje być zgodny z żadnym standardem ECMAScript, ale Internet Explorer 9 jest zgodny z ECMAScript 5.0.
Gdy pojedynczy argument jest przekazywany do new Date (), rzutuje ten prototyp funkcji:
Gdy dwa lub więcej argumentów zostanie przekazanych do new Date (), rzutuje ten prototyp funkcji:
Obie te funkcje powinny wyglądać znajomo, ale nie odpowiada to od razu na twoje pytanie, a to, co określa się jako akceptowalny „format daty” wymaga dalszych wyjaśnień. Gdy przekażesz ciąg znaków do nowej daty (), wywoła on prototyp (zwróć uwagę, że używam słowa prototyp luźno; wersje mogą być pojedynczymi funkcjami lub mogą być częścią instrukcji warunkowej w jednej funkcji) dla nowa data (wartość) z ciągiem jako argumentem parametru „wartość”. Ta funkcja najpierw sprawdzi, czy jest to liczba, czy ciąg. Dokumentację tej funkcji można znaleźć tutaj:
Na podstawie tego możemy wywnioskować, że aby zezwolić na formatowanie łańcucha dla nowej daty (wartości), musimy przyjrzeć się metodzie Date.parse (łańcuch). Dokumentację tej metody można znaleźć tutaj:
Możemy ponadto wywnioskować, że spodziewane są daty w zmodyfikowanym rozszerzonym formacie ISO 8601, jak określono tutaj:
Z doświadczenia możemy jednak rozpoznać, że obiekt Date javascript akceptuje inne formaty (wymuszone przez istnienie tego pytania w pierwszej kolejności), i jest to w porządku, ponieważ ECMAScript pozwala na formaty specyficzne dla implementacji. Jednak to wciąż nie odpowiada na pytanie, jaka dokumentacja jest dostępna w dostępnych formatach, ani jakie formaty są faktycznie dozwolone. Przyjrzymy się implementacji javascript Google, V8; Uwaga: nie sugeruję, że jest to „najlepszy” silnik javascript (w jaki sposób można zdefiniować „najlepszy”, a nawet „dobry”) i nie można zakładać, że formaty dozwolone w V8 reprezentują wszystkie dostępne obecnie formaty, ale myślę, że to uczciwe zakładać, że spełniają współczesne oczekiwania.
Patrząc na funkcję DateConstructor, możemy wywnioskować, że musimy znaleźć funkcję DateParse; należy jednak pamiętać, że „rok” nie jest faktycznym rokiem i jest jedynie odniesieniem do parametru „rok”.
To wywołuje% DateParseString, który w rzeczywistości jest referencją funkcji czasu wykonania dla funkcji C ++. Odnosi się do następującego kodu:
Wywołanie funkcji, której dotyczy ta funkcja, dotyczy funkcji DateParser :: Parse (); zignoruj logikę otaczającą te wywołania funkcji, są to tylko kontrole zgodności z typem kodowania (ASCII i UC16). DateParser :: Parse jest zdefiniowany tutaj:
Jest to funkcja, która faktycznie określa, jakie formaty akceptuje. Zasadniczo sprawdza zgodność ze standardem EMCAScript 5.0 ISO 8601, a jeśli nie jest zgodny ze standardami, podejmie próbę zbudowania daty na podstawie starszych formatów. Kilka kluczowych punktów na podstawie komentarzy:
To powinno wystarczyć, aby dać ci podstawowe pojęcie o tym, czego możesz się spodziewać, jeśli chodzi o przekazywanie ciągu znaków do obiektu Date. Możesz dalej rozwinąć tę kwestię, patrząc na następującą specyfikację, na którą wskazuje Mozilla w Mozilla Developer Network (zgodna ze znacznikami czasu IETF RFC 2822):
Microsoft Developer Network dodatkowo wspomina o dodatkowym standardzie dla obiektu Date: ECMA-402, specyfikacji interfejsu API internacjonalizacji ECMAScript, która jest komplementarna do standardu ECMAScript 5.1 (i przyszłych). Można to znaleźć tutaj:
W każdym razie powinno to pomóc w podkreśleniu, że nie ma „dokumentacji”, która uniwersalnie reprezentowałaby wszystkie implementacje javascript, ale wciąż dostępna jest wystarczająca ilość dokumentacji, aby rozsądnie zrozumieć, jakie ciągi znaków są dopuszczalne dla obiektu Date. Całkiem zadane pytanie, kiedy o tym pomyślisz, tak? : P
źródło
Pamiętaj, aby sprawdzić dane Datejs, gdy masz do czynienia z datami w JavaScript. Jest dość imponujący i dobrze udokumentowany, jak widać w przypadku funkcji toString .
EDYCJA : Tyler Forsythe zauważa, że dane są nieaktualne. Używam go w moim obecnym projekcie i nie miałem z tym żadnych problemów, jednak powinieneś być tego świadomy i rozważyć alternatywy.
źródło
Możesz po prostu rozwinąć
Date
Obiekt nowąformat
metodą, jak zauważył meizz , poniżej znajduje się kod podany przez autora. A oto jsfiddle .źródło
console.log(new Date('2014-06-01')) -> May
Myślę, że ma to coś wspólnego zePrzytaczana przez ciebie funkcjonalność nie jest standardowym Javascriptem, prawdopodobnie nie będzie przenośna w różnych przeglądarkach, a zatem nie jest dobrą praktyką. Specyfikacja ECMAScript 3 pozostawia funkcję analizy składni i formatów wyjściowych do implementacji Javascript. ECMAScript 5 dodaje podzbiór obsługi ISO8601. Wierzę, że wspomniana funkcja toString () jest innowacją w jednej przeglądarce (Mozilla?)
Kilka bibliotek udostępnia procedury do parametryzacji, niektóre z rozbudowaną obsługą lokalizacji. Możesz także sprawdzić metody w dojo.date.locale .
źródło
Zrobiłem ten bardzo prosty formatyzator, jest wycięty / n / pastowalny (zaktualizowany o starszą wersję):
http://snipplr.com/view/66968.82825/
źródło
new DateFmt()
)Bez ram, ograniczony, ale lekki
źródło
DateJS jest z pewnością w pełni funkcjonalny, ale polecam WIELE WIĘCEJ prostszej biblioteki lib (format daty JavaScript), którą wolę po prostu dlatego, że ma tylko około 120 linii.
źródło
Po przejrzeniu kilku opcji podanych w innych odpowiedziach, postanowiłem napisać własne ograniczone, ale proste rozwiązanie, które inni mogą również okazać się przydatne.
Przykładowe użycie:
źródło
format = format.replace("YY", (""+date.getFullYear()).substring(2));
. To staje się brzydkie - prawdopodobnie zamiast tego chcesz pójść trasą RegEx lub podobną.Oto funkcja, z której często korzystam. Wynikiem jest rrrr-mm-dd gg: mm: ss.nnn.
źródło
Przydatna może być ta modyfikacja obiektu daty, która jest mniejsza niż jakakolwiek biblioteka i można ją łatwo rozszerzyć w celu obsługi różnych formatów:
UWAGA:
KOD
POSŁUGIWAĆ SIĘ
źródło
Aby kontynuować solidną odpowiedź gongzhitaao - obsługuje AM / PM
źródło
Nie mogłem znaleźć żadnej ostatecznej dokumentacji dotyczącej prawidłowych formatów dat, dlatego napisałem własny test, aby sprawdzić, co jest obsługiwane w różnych przeglądarkach.
http://blarg.co.uk/blog/javascript-date-formats
Z moich wyników wynika, że następujące formaty są prawidłowe we wszystkich testowanych przeglądarkach (przykłady używają daty „9 sierpnia 2013 r.”):
[Pełny rok] / [Miesiąc] / [Numer daty] - Miesiąc może być albo liczbą z wiodącym zerem lub bez niego, albo nazwą miesiąca w krótkim lub długim formacie, a numer daty może być z wiodącym zerem lub bez niego.
[Miesiąc] / [Pełny rok] / [Numer daty] - Miesiąc może być liczbą z wiodącym zerem lub bez niego albo nazwą miesiąca w krótkim lub długim formacie, a numer daty może być z wiodącym zerem lub bez niego.
Dowolna kombinacja [Pełny rok], [Nazwa miesiąca] i [Numer daty] oddzielone spacjami - Nazwa miesiąca może mieć zarówno krótki, jak i długi format, a numer daty może być z wiodącym zerem lub bez niego.
Obowiązuje również w „nowoczesnych przeglądarkach” (lub innymi słowy we wszystkich przeglądarkach oprócz IE9 i niższych)
[Pełny rok] - [Numer miesiąca] - [Numer daty] - Numer miesiąca i daty musi zawierać początkowe zera (jest to format, którego używa typ daty MySQL )
Używanie nazw miesięcy:
Co ciekawe, podczas używania nazw miesięcy odkryłem, że używane są tylko pierwsze 3 znaki nazwy miesiąca, więc wszystkie poniższe elementy są całkowicie poprawne:
źródło
Formatowanie, a zwłaszcza parsowanie dat w JavaScript może być trochę uciążliwe. Nie wszystkie przeglądarki obsługują daty w ten sam sposób. Więc chociaż warto znać podstawowe metody, bardziej praktyczne jest użycie biblioteki pomocniczej.
Biblioteka XDate javascript przez Adam Shaw istnieje od połowy 2011 roku i nadal jest pod aktywnego rozwoju. Ma fantastyczną dokumentację, świetne API, formatowanie, stara się zachować zgodność wsteczną, a nawet obsługuje zlokalizowane ciągi.
Link do zmiany ciągów ustawień regionalnych: https://gist.github.com/1221376
źródło
Przykładowy kod:
Wynik:
źródło
new Date();// = Fri Nov 22 2013 17:48:22 GMT+0100
, wyjście z powyższym kodem będzie"16:48:22"
Biblioteka sugar.js ma świetną funkcjonalność do pracy z datami w JavaScript. I jest to bardzo dobrze udokumentowane .
Kilka przykładów:
źródło
Wszystkie przeglądarki
Najbardziej niezawodnym sposobem sformatowania daty za pomocą formatu źródłowego, którego używasz, jest wykonanie następujących kroków:
new Date()
do tworzeniaDate
obiektu.getDate()
,.getMonth()
i.getFullYear()
aby uzyskać odpowiednio dzień, miesiąc i rokPrzykład:
(Zobacz także to skrzypce ).
Tylko nowoczesne przeglądarki
Możesz również użyć wbudowanej
.toLocaleDateString
metody, aby wykonać formatowanie za Ciebie. Musisz tylko podać odpowiednie ustawienia regionalne i opcje, aby dopasować odpowiedni format, który niestety jest obsługiwany tylko przez nowoczesne przeglądarki (*) :(Zobacz także to skrzypce ).
(*) Zgodnie z MDN "Nowoczesne przeglądarki Chrome 24+" oznacza, Firefox 29+, IE11, Edge12 +, Opera 15+ & Safari nightly build
źródło
Kolejna opcja, którą napisałem:
Biblioteka DP_DateExtensions
Nie jestem pewien, czy to pomoże, ale uznałem to za przydatne w kilku projektach - wygląda na to, że zrobi to, czego potrzebujesz.
Obsługuje formatowanie daty / godziny, matematykę dat (dodawanie / odejmowanie części daty), porównywanie dat, parsowanie dat itp. Jest to dowolnie otwarte źródło.
Nie ma powodu, aby to rozważać, jeśli już używasz frameworka (wszystkie są w stanie), ale jeśli potrzebujesz tylko szybkiego dodania manipulacji datami do projektu, daj mu szansę.
źródło
Jeśli chcesz wyświetlać tylko czas za pomocą dwóch cyfr, może to pomóc:
źródło
użyj tej funkcji
zapoznaj się z poniższym linkiem, aby uzyskać więcej informacji https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
źródło
JsSimpleDateFormat to biblioteka, która może sformatować obiekt daty i przetworzyć sformatowany ciąg znaków z powrotem na obiekt daty. Używa formatu Java (klasa SimpleDateFormat). Nazwę miesięcy i dni można zlokalizować.
Przykład:
źródło
Odpowiedź brzmi „nigdzie”, ponieważ formatowanie daty stanowi zastrzeżoną funkcjonalność. Nie sądzę, aby funkcje toString były zgodne z określonym formatem. np. w specyfikacji ECMAScript 5.1 ( http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf , 2/8/2013, strona 173), funkcja toString jest udokumentowana w następujący sposób :
Funkcje takie jak poniższe przykłady mogą być wykorzystane do dość łatwego sformatowania.
źródło
Jeśli nie potrzebujesz wszystkich funkcji, które zapewnia biblioteka taka jak Moment.js , możesz użyć mojego portu Strftime . Jest lekki (1,35 KB vs. 57,9 KB zminimalizowany w porównaniu z Moment.js 2.15.0) i zapewnia większość funkcji
strftime()
.Przykładowe użycie:
Najnowszy kod jest dostępny tutaj: https://github.com/thdoan/strftime
źródło
Prawidłowy sposób sformatowania daty zwrotu „2012-12-29” to skrypt skryptu z formatu daty JavaScript :
Ten kod NIE działa:
źródło
Osobiście, ponieważ używam zarówno PHP, jak i jQuery / javascript w równych miarach, używam funkcji daty z php.js http://phpjs.org/functions/date/
Korzystanie z biblioteki, która używa tych samych ciągów formatu, co coś, co już wiem, jest dla mnie łatwiejsze, a instrukcja zawierająca wszystkie możliwości ciągów formatu dla funkcji daty jest oczywiście dostępna online na stronie php.net
Po prostu umieść plik date.js w swoim HTML za pomocą preferowanej metody, a następnie wywołaj go w następujący sposób:
Możesz użyć d1.getTime () zamiast valueOf (), jeśli chcesz, robią to samo.
Dzielenie przez 1000 znacznika czasu javascript polega na tym, że znacznik czasu javascript jest wyrażony w milisekundach, ale znacznik czasu PHP jest wyrażony w sekundach.
źródło
Wiele frameworków (których już prawdopodobnie używasz) ma formatowanie daty, o którym możesz nie wiedzieć. jQueryUI zostało już wspomniane, ale inne frameworki, takie jak Kendo UI (Globalizacja) , Yahoo UI (Util) i AngularJS również je mają.
źródło