Wo finde ich Dokumentation zum Formatieren eines Datums in JavaScript? [geschlossen]


1398

Mir ist aufgefallen, dass die new Date()Funktion von JavaScript sehr intelligent ist, wenn es darum geht, Daten in verschiedenen Formaten zu akzeptieren.

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

Ich konnte nirgendwo eine Dokumentation finden, die alle gültigen Zeichenfolgenformate beim Aufrufen der new Date()Funktion zeigt.

Dies dient zum Konvertieren einer Zeichenfolge in ein Datum. Wenn wir uns die gegenüberliegende Seite ansehen, dh ein Datumsobjekt in eine Zeichenfolge konvertieren, hatte ich bisher den Eindruck, dass JavaScript keine integrierte API zum Formatieren eines Datumsobjekts in eine Zeichenfolge hat.

Anmerkung des Herausgebers: Der folgende Ansatz ist der Versuch des Fragestellers, der in einem bestimmten Browser funktioniert hat, aber im Allgemeinen nicht funktioniert. In den Antworten auf dieser Seite finden Sie einige aktuelle Lösungen.

Heute habe ich mit der toString()Methode für das Datumsobjekt gespielt und überraschenderweise dient sie dazu, das Datum für Zeichenfolgen zu formatieren.

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

Auch hier konnte ich keine Dokumentation darüber finden, wie wir das Datumsobjekt in eine Zeichenfolge formatieren können.

Wo befindet sich die Dokumentation, in der die vom Date()Objekt unterstützten Formatbezeichner aufgeführt sind ?


165
Ihre Beispiele funktionieren nicht so, wie Sie denken: jsfiddle.net/edelman/WDNVk/1
Jason

27
Es tut uns leid, dass das Übergeben von Formatzeichenfolgen in toString in .NET funktioniert und möglicherweise in Java, aber wie Jason betonte, funktioniert dies in Javascript nicht wirklich.
Joshua Carmody

12
Leute erinnern sich - Fragen, egal wie kanonisch, müssen Fragen bleiben . Bitte unterlassen Sie jede Bearbeitung, die diese Frage in eine Antwort verwandelt, und verfeinern und pflegen Sie stattdessen die Antworten . Danke :)
Tim Post

1
Ich habe den Code in diesem Link verwendet. Msdn.microsoft.com/en-us/library/ie/ff743760(v=vs.94).aspx - (date.toLocaleDateString ("en-US"));
Khaled Annajar

Wenn zukünftige Besucher auf dieser Seite sind verwirrt durch , wie die meisten der Antworten auf die Frage beziehen, schlage ich die Lektüre Frage Revisionen , insbesondere (falls abweichend von oben) Revision 15 @ Eric Muyser - ich für eine durch das Fehlen der unwirksamen war verwirrt Datum # toString Verwendung.
user66001

Antworten:


1063

Ich liebe 10 Möglichkeiten, Zeit und Datum mit JavaScript und Arbeiten mit Daten zu formatieren .

Grundsätzlich haben Sie drei Methoden und müssen die Zeichenfolgen für sich selbst kombinieren:

getDate() // Returns the date
getMonth() // Returns the month
getFullYear() // Returns the year

Beispiel:

var d = new Date();
var curr_date = d.getDate();
var curr_month = d.getMonth() + 1; //Months are zero based
var curr_year = d.getFullYear();
console.log(curr_date + "-" + curr_month + "-" + curr_year);


27
Beide Websites verfügen über restriktive Lizenzen. Wenn Sie also den Code (ohne Erlaubnis) verwenden, liegt ein Verstoß vor. Momentjs ( stackoverflow.com/a/10119138/278976 ) scheint eine viel bessere Option zu sein und ist eine MIT-Lizenz.
Homer6

4
@peller Diese Antwort beantwortet die Frage "Wie formatiere ich Daten in Javascript?" Das ist effektiv der Titel der Frage. Im Hauptteil der Frage ist er ziemlich irreführend. Und Ihrer Meinung nach geht es in dieser Antwort nicht um die Formatierung von Zeichenfolgen mit zufälligen nicht standardmäßigen oder nicht erwähnten Bibliotheken. Dieser Teil der Frage wurde jedoch falsch gestellt, wie der erste Kommentar zu der Frage zeigt. Dies beantwortet also die eigentliche Frage, aber nicht die Formatstrings, die tatsächlich nicht existieren.
McKay

3
@ McKay; das war nicht die frage. Ich denke, Sie verstehen entweder falsch, was der Peller verlangt, oder Sie sind in Ihren Überlegungen stumpf.
Codeinthehole

10
@codeinthehole "Formatieren von Daten in Javascript" ist die Frage. "Bis jetzt hatte ich den Eindruck, dass JavaScript keine integrierte API zum Formatieren eines Datumsobjekts in eine Zeichenfolge hat." aber dann spricht über das Verhalten, von dem ich glaube, dass er es für einheimisch in Javascript hält. Ohne zu wissen, auf welche Bibliothek er fälschlicherweise verweist, ist die beste Vermutung, dass er die Frage stellt: "Wie formatiere ich Daten in Javascript?" und ich glaube nicht, dass ich wilde Sprünge mache.
McKay

5
MM Mittelwert 01-12, nicht 1-12: 2013-04-17 => OK 2013-4-17 => BAD
Adrian Maire

678

Moment.js

Es ist eine (leichte) * JavaScript-Datumsbibliothek zum Parsen, Bearbeiten und Formatieren von Datumsangaben.

var a = moment([2010, 1, 14, 15, 25, 50, 125]);
a.format("dddd, MMMM Do YYYY, h:mm:ss a"); // "Sunday, February 14th 2010, 3:25:50 pm"
a.format("ddd, hA");                       // "Sun, 3PM"

(*) Leichtgewicht bedeutet 9,3 KB minimiert + gezippt im kleinstmöglichen Setup (Februar 2014)


7
Dies bietet auch ein Dekorationsmuster um das Datumsobjekt, anstatt dass Affen das Kernobjekt lochen, sodass es später weniger wahrscheinlich zu Konflikten kommt.
Gabe Martin-Dempesy

120
Bitte hören Sie auf, das Wort "Leichtgewicht" zu missbrauchen. Sogar 5 KB sind für eine solche Funktionalität lächerlich groß, und bis heute hat sich diese Größe auf 19 KB erhöht.
user123444555621

27
@ Pumbaa80 Ich bin nicht der Meinung, dass "sogar 5 KB für eine solche Funktionalität lächerlich groß sind". Hast du die Dokumente gesehen? Es ist eine äußerst nützliche Bibliothek für den Umgang mit Daten in JS. Ich verstehe, dass eine Bibliothek mit mehr als ein paar KB für die einmalige Verwendung eines Basisformats wie "D / M / Y" ein wenig übertrieben sein kann, jedoch werden Unterschiede von einigen KB für die Benutzerfreundlichkeit der Bibliothek vernachlässigbar . Wartbarer Code ist eine gute Sache für ein paar KB. Wenn es + 100KB minimiert wäre, würde ich jedoch zustimmen.
Turnerj

15
@Tumerj argumentiert, dass es nützlich ist, nichts gegen das Problem der Leichtigkeit zu tun. Die beiden sind nicht verwandt.
JoshJordan

9
Sie können ein Düsenflugzeug nicht leichter machen, indem Sie das Triebwerk entfernen, da es dann zu einem Segelflugzeug und nicht zu einem Düsenflugzeug wird. Leichtgewicht bedeutet, dass etwas nur die erforderliche Funktionalität hat, um eine bestimmte Funktion auszuführen. Ergo ist dies eine leichte Lösung.
Bon

425

Wenn Sie in Ihrem Projekt bereits die jQuery-Benutzeroberfläche verwenden , können Sie die integrierte Datepicker-Methode zum Formatieren Ihres Datumsobjekts verwenden:

$.datepicker.formatDate('yy-mm-dd', new Date(2007, 1 - 1, 26));

Der Datepicker formatiert jedoch nur Datumsangaben und kann keine Zeiten formatieren.

Schauen Sie sich die Beispiele für jQuery UI datepicker formatDate an .


Wie sagt man ihm, dass er Ortszeit oder Zulu verwenden soll?
Ustaman Sangat

7
Ich bevorzuge diese Lösung, um die Zeit ohne Bibliothek abzurufen: new Date (). toTimeString (). match (/ ^ ([0-9] {2}: [0-9] {2}: [0-9 ] {2}) /) [0] FYI
markcial

Gibt es eine Möglichkeit, dies zu tun? $ .datepicker.formatDate ('yy-mm-dd', neues Datum ("txtAdvDate" .Val ()); oder so ähnlich
Pomster

@Pomster - warum denkst du, dass die Zeichenfolge "txtAdvDate" eine val-Methode enthält? Meinen Sie $ ('# txtAdvDate'). Val ()? Angenommen, es passt zu einem der Konstruktoren (siehe hier w3schools.com/jsref/jsref_obj_date.asp ), dann würde das gut funktionieren.
Vbullinger

@Pomster - versuchen Sie Folgendes: document.getElementById (id) .value = $ .datepicker.formatDate ('yy-mm-dd', neues Datum ());
mrrsb

219

Wo befindet sich die Dokumentation, in der die vom Date()Objekt unterstützten Formatbezeichner aufgeführt sind ?

Ich bin heute darauf gestoßen und war ziemlich überrascht, dass sich niemand die Zeit genommen hat, diese einfache Frage zu beantworten. Es stimmt, es gibt viele Bibliotheken, die bei der Datumsmanipulation helfen. Einige sind besser als andere. Aber das war nicht die gestellte Frage.

AFAIK, reines JavaScript unterstützt keine Formatbezeichner, wie Sie angegeben haben, dass Sie sie verwenden möchten . Aber es unterstützt Methoden zur Formatierung von Datums- und / oder Zeiten, wie .toLocaleDateString(), .toLocaleTimeString()und .toUTCString().

Die DateObjektreferenz, die ich am häufigsten verwende, befindet sich auf der Website w3schools.com (aber eine schnelle Google-Suche zeigt viel mehr, die Ihren Anforderungen möglicherweise besser entsprechen).

Beachten Sie auch, dass der Abschnitt Eigenschaften von Datumsobjekten einen Link zu enthält prototype, der einige Möglichkeiten veranschaulicht, wie Sie das Datumsobjekt mit benutzerdefinierten Methoden erweitern können. Es gab einige Diskussionen in der JavaScript - Community über die Jahre darüber , ob oder nicht , das ist beste Praxis, und ich bin nicht dafür , für oder gegen sie, nur seine Existenz hinzuweisen.



2
Meine Antwort versuchte auch diese Frage zu beantworten. Ich glaube, dass Firefox- oder Mozilla-Browser einmal eine Date.toString () -Methode bereitgestellt haben, die eine solche Formatierungszeichenfolge verwendet hat. Leider kann ich keine Spur der alten Dokumentation finden. Es ist nicht mehr Teil des Standards und scheint auch in Firefox nirgendwo mehr unterstützt zu werden.
Peller

214

Benutzerdefinierte Formatierungsfunktion:

Bei festen Formaten erledigt eine einfache Funktion den Job. Das folgende Beispiel generiert das internationale Format JJJJ-MM-TT:

function dateToYMD(date) {
    var d = date.getDate();
    var m = date.getMonth() + 1;
    var y = date.getFullYear();
    return '' + y + '-' + (m<=9 ? '0' + m : m) + '-' + (d <= 9 ? '0' + d : d);
}

Hinweis: Es ist jedoch normalerweise keine gute Idee, die Javascript-Standardbibliotheken zu erweitern (z. B. durch Hinzufügen dieser Funktion zum Prototyp von Date).

Eine erweiterte Funktion könnte eine konfigurierbare Ausgabe basierend auf einem Formatparameter generieren. Auf derselben Seite finden Sie einige gute Beispiele.

Wenn das Schreiben einer Formatierungsfunktion zu lang ist, gibt es viele Bibliotheken, in denen dies möglich ist. Einige andere Antworten führen sie bereits auf. Zunehmende Abhängigkeiten haben aber auch ein Gegenstück.

Standardfunktionen zur ECMAScript-Formatierung:

Seit neueren Versionen von ECMAscript verfügt die DateKlasse über einige spezifische Formatierungsfunktionen:

toDateString : Implementierungsabhängig, nur das Datum anzeigen .

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.todatestring

new Date().toDateString(); // e.g. "Fri Nov 11 2016"

toISOString : Datum und Uhrzeit von ISO 8601 anzeigen .

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.toisostring

new Date().toISOString(); // e.g. "2016-11-21T08:00:00.000Z"

toJSON : Stringifier für JSON.

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tojson

new Date().toJSON(); // e.g. "2016-11-21T08:00:00.000Z"

toLocaleDateString : Implementierungsabhängig, ein Datum im Gebietsschemaformat.

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tolocaledatestring

new Date().toLocaleDateString(); // e.g. "21/11/2016"

toLocaleString : Implementierungsabhängig, Datum und Uhrzeit im Gebietsschemaformat.

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tolocalestring

new Date().toLocaleString(); // e.g. "21/11/2016, 08:00:00 AM"

toLocaleTimeString : Implementierungsabhängig, eine Zeit im Gebietsschemaformat.

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tolocaletimestring

new Date().toLocaleTimeString(); // e.g. "08:00:00 AM"

toString : Generischer toString für Datum.

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tostring

new Date().toString(); // e.g. "Fri Nov 11 2016 08:00:00 GMT+0100 (W. Europe Standard Time)"

Hinweis: Aus diesen Formatierungsfunktionen können benutzerdefinierte Ausgaben generiert werden:

new Date().toISOString().slice(0,10); // By @Image72, return YYYY-MM-DD

10
Es sollte Antwort akzeptiert werden, weil es das erforderliche Format gibt (01-01-2000, nicht 1-1-2000)
Danubian Sailor

6
neues Datum (). toISOString (). Slice (0,10) // "2015-04-27"
image72

2
Es wäre sehr hilfreich, das Beispiel nicht mit dem 11. September zu haben, damit klar wäre, an welcher Position Tag und Monat vertreten sind.
Karl Adler

1
@abimelex fertig. Hoffe es ist jetzt klarer.
Adrian Maire

1
Vielen Dank, dass Sie die Links zur Quelle hinzugefügt haben (: - siehe auch developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… und developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…
Sandra

125

Die kurze Antwort

Es gibt keine „universelle“ Dokumentation, für die Javascript geeignet ist. Jeder Browser mit Javascript ist wirklich eine Implementierung. Es gibt jedoch einen Standard, dem die meisten modernen Browser folgen, und das ist der EMCAScript-Standard. Die ECMAScript-Standardzeichenfolgen würden mindestens eine modifizierte Implementierung der ISO 8601-Definition erfordern.

Darüber hinaus gibt es einen zweiten von der IETF vorgegebenen Standard , dem auch Browser folgen. Dies ist die Definition für Zeitstempel, die im RFC 2822 erstellt wurden. Die aktuelle Dokumentation finden Sie in der Referenzliste unten.

Von diesem können Sie grundlegende Funktionen erwarten, aber was "sein sollte", ist nicht von Natur aus das, was "ist". Ich werde mich jedoch ein wenig eingehend mit diesem Verfahren befassen, da anscheinend nur drei Personen tatsächlich die Frage beantwortet haben (Scott, goofballLogic und peller), was für mich darauf hindeutet, dass die meisten Menschen nicht wissen, was tatsächlich passiert, wenn Sie Erstellen Sie ein Datumsobjekt.


Die lange Antwort

Wo befindet sich die Dokumentation, in der die vom Date () - Objekt unterstützten Formatbezeichner aufgeführt sind?


Um die Frage zu beantworten oder normalerweise sogar nach der Antwort auf diese Frage zu suchen, müssen Sie wissen, dass Javascript keine neuartige Sprache ist. Es handelt sich tatsächlich um eine Implementierung von ECMAScript und folgt den ECMAScript-Standards (beachten Sie jedoch, dass Javascript diese Standards auch tatsächlich vorweggenommen hat; EMCAScript-Standards basieren auf der frühen Implementierung von LiveScript / JavaScript). Der aktuelle ECMAScript-Standard ist 5.1 (2011); Zu dem Zeitpunkt, als die Frage ursprünglich gestellt wurde (Juni '09), war der Standard 3 (4 wurde aufgegeben), aber 5 wurde kurz nach dem Post Ende 2009 veröffentlicht. Dies sollte ein Problem umreißen; Welchem ​​Standard eine Javascript-Implementierung folgen kann, spiegelt möglicherweise nicht wider, was tatsächlich vorhanden ist, da a) es sich um eine Implementierung eines bestimmten Standards handelt, b) nicht alle Implementierungen eines Standards puritanisch sind,

Im Wesentlichen handelt es sich beim Umgang mit Javascript um ein Derivat (für den Browser spezifisches Javascript) einer Implementierung (Javascript selbst). Google V8 implementiert beispielsweise ECMAScript 5.0, aber JScript von Internet Explorer versucht nicht, einem ECMAScript-Standard zu entsprechen, Internet Explorer 9 entspricht jedoch ECMAScript 5.0.

Wenn ein einzelnes Argument an new Date () übergeben wird, wird dieser Funktionsprototyp umgewandelt:

new Date(value)

Wenn zwei oder mehr Argumente an new Date () übergeben werden, wird dieser Funktionsprototyp umgewandelt:

new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )


Beide Funktionen sollten vertraut aussehen, aber dies beantwortet Ihre Frage nicht sofort und was als akzeptables „Datumsformat“ quantifiziert wird, bedarf weiterer Erläuterungen. Wenn Sie eine Zeichenfolge an new Date () übergeben, wird der Prototyp aufgerufen (beachten Sie, dass ich das Wort Prototyp lose verwende; die Versionen können einzelne Funktionen sein oder Teil einer bedingten Anweisung in einer einzelnen Funktion) für neues Datum (Wert) mit Ihrer Zeichenfolge als Argument für den Parameter "Wert". Diese Funktion prüft zunächst, ob es sich um eine Zahl oder eine Zeichenfolge handelt. Die Dokumentation zu dieser Funktion finden Sie hier:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.3.2

Daraus können wir schließen, dass wir uns die Methode Date.parse (Zeichenfolge) ansehen müssen, um die für neues Datum (Wert) zulässige Zeichenfolgenformatierung zu erhalten. Die Dokumentation zu dieser Methode finden Sie hier:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.4.2

Und wir können weiter schließen, dass die Daten voraussichtlich in einem modifizierten erweiterten ISO 8601-Format vorliegen, wie hier angegeben:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15

Aus Erfahrung können wir jedoch erkennen, dass das Date-Objekt von Javascript andere Formate akzeptiert (was durch das Vorhandensein dieser Frage in erster Linie erzwungen wird), und dies ist in Ordnung, da ECMAScript implementierungsspezifische Formate zulässt. Dies beantwortet jedoch immer noch nicht die Frage, welche Dokumentation zu den verfügbaren Formaten verfügbar ist und welche Formate tatsächlich zulässig sind. Wir werden uns die Javascript-Implementierung von Google, V8, ansehen. Bitte beachten Sie, dass ich nicht vorschlage, dass dies die "beste" Javascript-Engine ist (wie kann man "beste" oder sogar "gut" definieren) und man nicht davon ausgehen kann, dass die in V8 zulässigen Formate alle heute verfügbaren Formate darstellen, aber ich denke, dass dies fair ist anzunehmen, dass sie den modernen Erwartungen folgen.

Googles V8, date.js, DateConstructor

https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#141

Wenn wir uns die DateConstructor-Funktion ansehen, können wir ableiten, dass wir die DateParse-Funktion finden müssen. Beachten Sie jedoch, dass „Jahr“ nicht das tatsächliche Jahr ist und nur auf den Parameter „Jahr“ verweist.

Googles V8, date.js, DateParse

https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#270

Dies ruft% DateParseString auf, was eigentlich eine Laufzeitfunktionsreferenz für eine C ++ - Funktion ist. Es bezieht sich auf den folgenden Code:

Googles V8, runtime.cc,% DateParseString

https://code.google.com/p/v8/source/browse/trunk/src/runtime.cc?r=18400#9559

Der Funktionsaufruf, mit dem wir uns in dieser Funktion befassen, ist für DateParser :: Parse (); Ignorieren Sie die Logik, die diese Funktionsaufrufe umgibt. Dies sind lediglich Überprüfungen, um dem Codierungstyp (ASCII und UC16) zu entsprechen. DateParser :: Parse ist hier definiert:

Googles V8, dateparser-inl.h, DateParser :: Parse

https://code.google.com/p/v8/source/browse/trunk/src/dateparser-inl.h?r=18400#36

Dies ist die Funktion, die tatsächlich definiert, welche Formate akzeptiert werden. Im Wesentlichen wird nach dem EMCAScript 5.0 ISO 8601-Standard gesucht. Wenn dieser nicht den Standards entspricht, wird versucht, das Datum auf der Grundlage älterer Formate zu erstellen. Einige wichtige Punkte basierend auf den Kommentaren:

  1. Wörter vor der ersten Nummer, die dem Parser unbekannt sind, werden ignoriert.
  2. Text in Klammern wird ignoriert.
  3. Vorzeichenlose Zahlen gefolgt von „:“ werden als „Zeitkomponente“ interpretiert.
  4. Vorzeichenlose Nummern gefolgt von "." werden als „Zeitkomponente“ interpretiert und müssen von Millisekunden gefolgt werden.
  5. Vorzeichenbehaftete Zahlen, gefolgt von Stunde oder Stunde Minute (z. B. +5: 15 oder +0515), werden als Zeitzone interpretiert.
  6. Bei der Angabe von Stunde und Minute können Sie entweder "hh: mm" oder "hhmm" verwenden.
  7. Wörter, die eine Zeitzone angeben, werden als Zeitzone interpretiert.
  8. Alle anderen Zahlen werden als „Datumskomponenten“ interpretiert.
  9. Alle Wörter, die mit den ersten drei Ziffern eines Monats beginnen, werden als Monat interpretiert.
  10. Sie können Minuten und Stunden zusammen in einem der beiden Formate definieren: "hh: mm" oder "hhmm".
  11. Symbole wie "+", "-" und nicht übereinstimmend ")" sind nach der Verarbeitung einer Nummer nicht mehr zulässig.
  12. Elemente, die mehreren Formaten entsprechen (z. B. 1970-01-01), werden als standardkonforme EMCAScript 5.0 ISO 8601-Zeichenfolge verarbeitet.

Dies sollte also ausreichen, um Ihnen eine grundlegende Vorstellung davon zu geben, was Sie erwartet, wenn Sie eine Zeichenfolge an ein Date-Objekt übergeben. Sie können dies weiter ausbauen, indem Sie sich die folgende Spezifikation ansehen, auf die Mozilla im Mozilla Developer Network verweist (gemäß den IETF RFC 2822-Zeitstempeln):

http://tools.ietf.org/html/rfc2822#page-14

Das Microsoft Developer Network erwähnt zusätzlich einen zusätzlichen Standard für das Date-Objekt: ECMA-402, die ECMAScript Internationalization API-Spezifikation, die den ECMAScript 5.1-Standard (und zukünftige) ergänzt. Das finden Sie hier:

http://www.ecma-international.org/ecma-402/1.0/

In jedem Fall sollte dies dazu beitragen, hervorzuheben, dass es keine "Dokumentation" gibt, die universell alle Implementierungen von Javascript darstellt, aber dennoch genügend Dokumentation verfügbar ist, um einen vernünftigen Eindruck davon zu bekommen, welche Zeichenfolgen für ein Date-Objekt akzeptabel sind. Ziemlich die geladene Frage, wenn Sie darüber nachdenken, ja? : P.

Verweise

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.3.2

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.4.2

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15

http://tools.ietf.org/html/rfc2822#page-14

http://www.ecma-international.org/ecma-402/1.0/

https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#141

https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#270

https://code.google.com/p/v8/source/browse/trunk/src/runtime.cc?r=18400#9559

https://code.google.com/p/v8/source/browse/trunk/src/dateparser-inl.h?r=18400#36

Ressourcen

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

http://msdn.microsoft.com/en-us/library/ff743760(v=vs.94).aspx


92

Stellen Sie sicher, dass Sie Datejs auschecken, wenn Sie mit Datumsangaben in JavaScript arbeiten. Es ist ziemlich beeindruckend und gut dokumentiert, wie Sie im Fall der toString-Funktion sehen können .

EDIT : Tyler Forsythe weist darauf hin, dass das Datum veraltet ist. Ich verwende es in meinem aktuellen Projekt und hatte keine Probleme damit. Sie sollten sich dessen jedoch bewusst sein und Alternativen in Betracht ziehen.


2
Ich konnte keine Möglichkeit finden, Datumsangaben mit Millisekunden zu versehen, um ein Datum zu erstellen. So: var dateTime = new Date (); dateTime.setTime (Millisekunden);
Arne Evertsson

14
25k? Nur für Dates? Autsch.
Ben Lesh

13
Datejs ist eine veraltete Bibliothek, die seit ~ 5 Jahren nicht mehr aktiv entwickelt wurde. Ihre Quelle ist Github und Google Code und beide haben die letzten aktualisierten Daten von 2008 (es ist 2013). Verwenden Sie XDate oder Moment.js, um Ihrer Gesundheit willen.
Tyler Forsythe

3
@ TylerForsythe Ich habe einen Hinweis / eine Warnung dazu hinzugefügt.
Tim Büthe

2
lol das
Datumsskript

69

Sie können das DateObjekt einfach mit einer neuen formatMethode erweitern, wie von meizz angegeben . Unten finden Sie den vom Autor angegebenen Code. Und hier ist eine Geige .

Date.prototype.format = function(format) //author: meizz
{
  var o = {
    "M+" : this.getMonth()+1, //month
    "d+" : this.getDate(),    //day
    "h+" : this.getHours(),   //hour
    "m+" : this.getMinutes(), //minute
    "s+" : this.getSeconds(), //second
    "q+" : Math.floor((this.getMonth()+3)/3),  //quarter
    "S" : this.getMilliseconds() //millisecond
  }

  if(/(y+)/.test(format)) format=format.replace(RegExp.$1,
    (this.getFullYear()+"").substr(4 - RegExp.$1.length));
  for(var k in o)if(new RegExp("("+ k +")").test(format))
    format = format.replace(RegExp.$1,
      RegExp.$1.length==1 ? o[k] :
        ("00"+ o[k]).substr((""+ o[k]).length));
  return format;
}

alert(new Date().format("yyyy-MM-dd"));
alert(new Date("january 12 2008 11:12:30").format("yyyy-MM-dd h:mm:ss"));

Es wurde für meine Zwecke etwas verbessert, um AM / PM zu unterstützen - siehe unten
Michael Angstadt

@WHK Aber ich mag Momente immer noch mehr: D
Gongzhitaao

Haben Sie ein Problem beim Erfassen des Monats: neues Datum ((neues Datum ()). Format ('JJJJ-MM-TT')) Rückgabe Mai, aber jetzt ist Jun: - / Wer verwendet die Zeitzone in der Analysezeichenfolge?
E-Info128

1
@WHK Dies ist eigentlich ein sehr primitiver Datums-Parser. Nur für den Fall, dass Sie sich nicht zu sehr mit dem Datum anlegen müssen. Wenn Sie wirklich mit verschiedenen Datumsformaten fertig werden müssen, würde ich eine eigenständige Bibliothek wie momentjs empfehlen. : D
Gongzhitaao

1
@WHK Denn console.log(new Date('2014-06-01')) -> Mayich denke, es hat etwas mit der Zeitzone zu tun: D
Gongzhitaao

37

Die von Ihnen genannte Funktionalität ist kein Standard-Javascript, wahrscheinlich nicht für alle Browser portierbar und daher keine bewährte Methode. Die ECMAScript 3-Spezifikation überlässt die Funktion für Analyse- und Ausgabeformate der Javascript-Implementierung. ECMAScript 5 fügt eine Teilmenge der ISO8601-Unterstützung hinzu. Ich glaube, die von Ihnen erwähnte Funktion toString () ist eine Innovation in einem Browser (Mozilla?)

Mehrere Bibliotheken bieten Routinen zur Parametrisierung, einige mit umfassender Lokalisierungsunterstützung. Sie können die Methoden auch in dojo.date.locale überprüfen .


5
Wenn Sie versuchen, die Frage tatsächlich zu beantworten, erhalten Sie nicht viele Stimmen. Nominieren Sie einfach eine beliebte Bibliothek und sehen Sie, wie Ihre Partitur fliegt!
RobG

30

Ich habe diesen sehr einfachen Formatierer erstellt, er ist cut / n / pastable (aktualisiert mit einer übersichtlicheren Version):

function DateFmt(fstr) {
  this.formatString = fstr

  var mthNames = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
  var dayNames = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
  var zeroPad = function(number) {
     return ("0"+number).substr(-2,2);
  }

  var dateMarkers = {
    d:['getDate',function(v) { return zeroPad(v)}],
    m:['getMonth',function(v) { return zeroPad(v+1)}],
    n:['getMonth',function(v) { return mthNames[v]; }],
    w:['getDay',function(v) { return dayNames[v]; }],
    y:['getFullYear'],
    H:['getHours',function(v) { return zeroPad(v)}],
    M:['getMinutes',function(v) { return zeroPad(v)}],
    S:['getSeconds',function(v) { return zeroPad(v)}],
    i:['toISOString']
  };

  this.format = function(date) {
    var dateTxt = this.formatString.replace(/%(.)/g, function(m, p) {
      var rv = date[(dateMarkers[p])[0]]()

      if ( dateMarkers[p][1] != null ) rv = dateMarkers[p][1](rv)

      return rv

    });

    return dateTxt
  }

}

fmt = new DateFmt("%w %d:%n:%y - %H:%M:%S  %i")
v = fmt.format(new Date())

http://snipplr.com/view/66968.82825/


4
Ich mag diese Klasse, denke aber, dass es eine "statische" Klasse sein sollte. Sie müssen es nicht mehr als einmal instanziieren. (sollte nicht brauchen new DateFmt())
Cheeso

1
Cheeso: Was ist, wenn ich 10 verschiedene Daten auf einer Seite auf 3 verschiedene Arten formatieren möchte? In diesem Fall wäre es nützlich, drei Instanzen dieses Formatierers zu haben. Das ist ein absolut gültiger Anwendungsfall, den dies ausschließen würde. Das OP hat dies richtig entworfen. Durch die Angabe eines Formats zur Erstellungszeit wird die Codeduplizierung erspart, da jedes Mal, wenn Sie eine bestimmte Formatierung benötigen, ein Format angegeben wird.
Hsanders

29

Framework frei, begrenzt aber leicht

var d = (new Date()+'').split(' ');
// ["Tue", "Sep", "03", "2013", "21:54:52", "GMT-0500", "(Central", "Daylight", "Time)"]

[d[3], d[1], d[2], d[4]].join(' ');
// "2013 Sep 03 21:58:03"

ist das Cross-Browser? und Gebietsschema überqueren?
Iftah

Ja. Zeigt die Zeit in Ihrer lokalen Zeitzone (Browser-Benutzer) an.
John Williams


18

Nachdem ich einige der in anderen Antworten enthaltenen Optionen durchgesehen hatte, beschloss ich, meine eigene begrenzte, aber einfache Lösung zu schreiben, die andere möglicherweise ebenfalls nützlich finden.

/**
* Format date as a string
* @param date - a date object (usually "new Date();")
* @param format - a string format, eg. "DD-MM-YYYY"
*/
function dateFormat(date, format) {
    // Calculate date parts and replace instances in format string accordingly
    format = format.replace("DD", (date.getDate() < 10 ? '0' : '') + date.getDate()); // Pad with '0' if needed
    format = format.replace("MM", (date.getMonth() < 9 ? '0' : '') + (date.getMonth() + 1)); // Months are zero-based
    format = format.replace("YYYY", date.getFullYear());
    return format;
}

Anwendungsbeispiel:

console.log("The date is: " + dateFormat(new Date(), "DD/MM/YYYY"));

2
Ersetzungsvorgänge sind nicht wirklich effizient, daher ist es besser, dies zu verhindern.
Mrzmyr

Was passiert, wenn ich schreibe? console.log ("Das Datum ist:" + dateFormat (neues Datum (), "TT / MM / JJ"));
Hakan

1
Dadurch wird der Text "Das Datum ist: 12/11 / JJ" gedruckt, da oben keine zweistelligen Daten behandelt werden. Wenn Sie dies benötigen, können Sie unmittelbar vor der return-Anweisung Folgendes hinzufügen : format = format.replace("YY", (""+date.getFullYear()).substring(2));. Dies wird jedoch hässlich - Sie möchten wahrscheinlich stattdessen die RegEx-Route oder ähnliches wählen.
Ollie Bennett

1
@mrzmyr Glauben Sie wirklich, dass das Formatieren von Daten ein Leistungsengpass sein wird? Komm schon.
Doug65536

11

Hier ist eine Funktion, die ich oft benutze. Das Ergebnis ist JJJJ-MM-TT HH: MM: SS.NNN.

function date_and_time() {
    var date = new Date();
    //zero-pad a single zero if needed
    var zp = function (val){
        return (val <= 9 ? '0' + val : '' + val);
    }

    //zero-pad up to two zeroes if needed
    var zp2 = function(val){
        return val <= 99? (val <=9? '00' + val : '0' + val) : ('' + val ) ;
    }

    var d = date.getDate();
    var m = date.getMonth() + 1;
    var y = date.getFullYear();
    var h = date.getHours();
    var min = date.getMinutes();
    var s = date.getSeconds();
    var ms = date.getMilliseconds();
    return '' + y + '-' + zp(m) + '-' + zp(d) + ' ' + zp(h) + ':' + zp(min) + ':' + zp(s) + '.' + zp2(ms);
}

1
Gute Antwort, aber ich denke, Sie sollten die zp2-Funktion wie folgt ändern: var zp2 = function (val) {return val <= 9? '00' + val: (val <= 99? '0' + val: '' + val); }
Eric Wang

1
Es gibt eine Ausnahme: Wenn der Wert von ms part 0 ist, ist er nicht derselbe. In Ihrer Funktion ist das Ergebnis '00', aber nicht '000'.
Eric Wang

9

Diese Änderung des Datumsobjekts ist möglicherweise nützlich. Sie ist kleiner als jede Bibliothek und kann problemlos erweitert werden, um verschiedene Formate zu unterstützen:

HINWEIS:

  • Es verwendet Object.keys (), das in älteren Browsern nicht definiert ist, sodass Sie möglicherweise Polyfill über einen bestimmten Link implementieren müssen.

CODE

Date.prototype.format = function(format) {
    // set default format if function argument not provided
    format = format || 'YYYY-MM-DD hh:mm';

    var zeropad = function(number, length) {
            number = number.toString();
            length = length || 2;
            while(number.length < length)
                number = '0' + number;
            return number;
        },
        // here you can define your formats
        formats = {
            YYYY: this.getFullYear(),
            MM: zeropad(this.getMonth() + 1),
            DD: zeropad(this.getDate()),
            hh: zeropad(this.getHours()),
            mm: zeropad(this.getMinutes())
        },
        pattern = '(' + Object.keys(formats).join(')|(') + ')';

    return format.replace(new RegExp(pattern, 'g'), function(match) {
        return formats[match];
    });
};

VERWENDEN

var now = new Date;
console.log(now.format());
// outputs: 2015-02-09 11:47
var yesterday = new Date('2015-02-08');
console.log(yesterday.format('hh:mm YYYY/MM/DD'));
// outputs: 00:00 2015/02/08

8

Nur um die solide Antwort von Gongzhitaao fortzusetzen - dies behandelt AM / PM

 Date.prototype.format = function (format) //author: meizz
{
    var hours = this.getHours();
    var ttime = "AM";
    if(format.indexOf("t") > -1 && hours > 12)
    {
        hours = hours - 12;
        ttime = "PM";
     }

var o = {
    "M+": this.getMonth() + 1, //month
    "d+": this.getDate(),    //day
    "h+": hours,   //hour
    "m+": this.getMinutes(), //minute
    "s+": this.getSeconds(), //second
    "q+": Math.floor((this.getMonth() + 3) / 3),  //quarter
    "S": this.getMilliseconds(), //millisecond,
    "t+": ttime
}

if (/(y+)/.test(format)) format = format.replace(RegExp.$1,
  (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o) if (new RegExp("(" + k + ")").test(format))
    format = format.replace(RegExp.$1,
      RegExp.$1.length == 1 ? o[k] :
        ("00" + o[k]).substr(("" + o[k]).length));
return format;
}

Sehr gute Lösung! var a = neues Datum (); a.format ('yyyy-MM-d'); // Rückgabe 16.08.2013.
Adrian Maire

this.getMonth (); schlägt in iOS fehl
N20084753

7

Ich konnte keine endgültige Dokumentation zu gültigen Datumsformaten finden und habe meinen eigenen Test geschrieben, um festzustellen, was in verschiedenen Browsern unterstützt wird.

http://blarg.co.uk/blog/javascript-date-formats

Meine Ergebnisse haben ergeben, dass die folgenden Formate in allen von mir getesteten Browsern gültig sind (Beispiele verwenden das Datum "9. August 2013"):

[Volles Jahr] / [Monat] / [Datumsnummer] - Monat kann entweder die Zahl mit oder ohne führende Null oder der Monatsname im Kurz- oder Langformat sein, und die Datumsnummer kann mit oder ohne führende Null sein.

  • 09.08.2013
  • 09.08.2013
  • 09.08.2013
  • 09.08.2013
  • 2013 / August / 09
  • 2013 / August / 9
  • 2013 / Aug / 09
  • 2013 / Aug / 9

[Monat] / [Volles Jahr] / [Datumsnummer] - Monat kann entweder die Zahl mit oder ohne führende Null oder der Monatsname im Kurz- oder Langformat sein, und die Datumsnummer kann mit oder ohne führende Null sein.

  • 08/2013/09
  • 08/2013/9
  • 8/2013/09
  • 8/2013/9
  • August / 2013/09
  • August / 2013/9
  • Aug / 2013/09
  • Aug / 2013/9

Jede durch Leerzeichen getrennte Kombination aus [Gesamtjahr], [Monatsname] und [Datumsnummer] - Der Monatsname kann entweder kurz oder lang sein, und die Datumsnummer kann mit oder ohne führende Null sein.

  • 2013 August 09
  • August 2013 09
  • 09. August 2013
  • 2013 Aug 09
  • 9. August 2013
  • 2013 9 Aug.
  • usw...

Auch gültig in "modernen Browsern" (oder mit anderen Worten allen Browsern außer IE9 und darunter)

[Ganzes Jahr] - [Monatsnummer] - [Datumsnummer] - Monat und Datumsnummer müssen führende Nullen enthalten (dies ist das Format, das der MySQL-Datumstyp verwendet).

  • 09.08.2013

Verwenden von Monatsnamen:
Interessanterweise habe ich bei der Verwendung von Monatsnamen festgestellt, dass nur die ersten drei Zeichen des Monatsnamens verwendet werden, sodass alle folgenden Punkte vollkommen gültig sind:

new Date('9 August 2013');
new Date('9 Aug 2013');
new Date('9 Augu 2013');
new Date('9 Augustagfsdgsd 2013');

6

Das Formatieren und insbesondere das Parsen von Daten in JavaScript kann Kopfschmerzen bereiten. Nicht alle Browser behandeln Datumsangaben gleich. Während es nützlich ist, die Basismethoden zu kennen, ist es praktischer, eine Hilfsbibliothek zu verwenden.

Die Javascript-Bibliothek XDate von Adam Shaw gibt es seit Mitte 2011 und befindet sich noch in der aktiven Entwicklung. Es hat eine fantastische Dokumentation, eine großartige API, Formatierung, versucht abwärtskompatibel zu bleiben und unterstützt sogar lokalisierte Zeichenfolgen.

Link zum Ändern der Gebietsschema-Zeichenfolgen: https://gist.github.com/1221376


6

Beispielcode:

var d = new Date();
var time = d.toISOString().replace(/.*?T(\d+:\d+:\d+).*/, "$1");

Ausgabe:

"13:45:20"


2
erwähnenswert mit toISOString (); es gibt UTC aus. Wenn also new Date();// = Fri Nov 22 2013 17:48:22 GMT+0100, wird die Ausgabe mit dem obigen Code sein"16:48:22"
Tewr

6

Die Bibliothek sugger.js bietet einige großartige Funktionen für die Arbeit mit Datumsangaben in JavaScript. Und es ist sehr gut dokumentiert .

Sugar gibt der Date-Klasse viel Liebe, beginnend mit der Date.create-Methode, die Datumsangaben in nahezu jedem Format in 15 Hauptsprachen verstehen kann, einschließlich relativer Formate wie "vor 1 Stunde". Daten können auch in einem beliebigen Format oder einer beliebigen Sprache mit einer leicht verständlichen Syntax ausgegeben werden, mit Verknüpfungen zu häufig verwendeten Datumsformaten. Ein komplexer Datumsvergleich ist auch mit Methoden wie is möglich, die jedes Format verstehen und eingebaute Präzision anwenden.

Einige Beispiele:

Date.create('July 4, 1776')  -> July 4, 1776
Date.create(-446806800000)   -> November 5, 1955
Date.create(1776, 6, 4)      -> July 4, 1776
Date.create('1776年07月04日', 'ja') -> July 4, 1776
Date.utc.create('July 4, 1776', 'en')  -> July 4, 1776

Date.create().format('{Weekday} {d} {Month}, {yyyy}')    -> Monday July 4, 2003
Date.create().format('{hh}:{mm}')                        -> 15:57
Date.create().format('{12hr}:{mm}{tt}')                  -> 3:57pm
Date.create().format(Date.ISO8601_DATETIME)              -> 2011-07-05 12:24:55.528Z

Date.create().is('the 7th of June') -> false
Date.create().addMonths(2); ->"Sunday, June 15, 2014 13:39"

4

Alle Browser

Die zuverlässigste Methode zum Formatieren eines Datums mit dem von Ihnen verwendeten Quellformat besteht darin, die folgenden Schritte auszuführen:

  1. Verwenden Sie new Date()diese Option , um ein DateObjekt zu erstellen
  2. Verwendung .getDate(), .getMonth()und.getFullYear() erhalten jeweils den Tag, Monat und Jahr
  3. Fügen Sie die Teile entsprechend Ihrem Zielformat zusammen

Beispiel:

var date = '2015-11-09T10:46:15.097Z';

function format(input) {
    var date = new Date(input);
    return [
       ("0" + date.getDate()).slice(-2),
       ("0" + (date.getMonth()+1)).slice(-2),
       date.getFullYear()
    ].join('/');
}

document.body.innerHTML = format(date); // OUTPUT : 09/11/2015

(Siehe auch diese Geige ).


Nur moderne Browser

Sie können auch die integrierte .toLocaleDateStringMethode verwenden, um die Formatierung für Sie durchzuführen. Sie müssen nur das richtige Gebietsschema und die richtigen Optionen angeben, um das richtige Format zu finden, das leider nur von modernen Browsern unterstützt wird (*) :

var date = '2015-11-09T10:46:15.097Z';

function format(input) {
    return new Date(input).toLocaleDateString('en-GB', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit'
    });
}

document.body.innerHTML = format(date); // OUTPUT : 09/11/2015

(Siehe auch diese Geige ).


(*) Laut MDN bedeutet "Moderne Browser" die nächtliche Erstellung von Chrome 24+, Firefox 29+, IE11, Edge12 +, Opera 15+ und Safari


3

Nur eine weitere Option, die ich geschrieben habe:

DP_DateExtensions-Bibliothek

Ich bin mir nicht sicher, ob es helfen wird, aber ich fand es in mehreren Projekten nützlich - es sieht so aus, als würde es das tun, was Sie brauchen.

Unterstützt Datums- / Uhrzeitformatierung, Datumsberechnung (Hinzufügen / Subtrahieren von Datumsteilen), Datumsvergleich, Datumsanalyse usw. Es ist großzügig Open Source.

Kein Grund, darüber nachzudenken, wenn Sie bereits ein Framework verwenden (alle sind in der Lage), aber wenn Sie einem Projekt nur schnell eine Datumsmanipulation hinzufügen müssen, geben Sie ihm eine Chance.



2

Wenn Sie nur die Zeit mit zwei Ziffern anzeigen möchten , kann dies hilfreich sein:

var now = new Date();
var cHour = now.getHours();
var cMinuts = now.getMinutes();
var cSeconds = now.getSeconds();

var outStr = (cHour <= 0 ? ('0' + cHour) : cHour) + ':' + (cMinuts <= 9 ? ('0' + cMinuts) : cMinuts) + ':' + (cSeconds <= 9 ? '0' + cSeconds : cSeconds);


1

JsSimpleDateFormat ist eine Bibliothek, die das Datumsobjekt formatieren und die formatierte Zeichenfolge zurück zum Datumsobjekt analysieren kann. Es verwendet das Java-Format (SimpleDateFormat-Klasse). Der Name von Monaten und Tagen kann lokalisiert werden.

Beispiel:

var sdf = new JsSimpleDateFormat("EEEE, MMMM dd, yyyy");
var formattedString = sdf.format(new Date());
var dateObject = sdf.parse("Monday, June 29, 2009");

1

Die Antwort lautet "nirgendwo", da die Datumsformatierung eine proprietäre Funktionalität ist. Ich glaube nicht, dass die toString-Funktionen einem bestimmten Format entsprechen sollen. Beispiel: In der ECMAScript 5.1-Spezifikation ( http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf , 08.02.2013, Seite 173) ist die toString- Funktion wie folgt dokumentiert ::

"Der Inhalt des Strings ist implementierungsabhängig"

Funktionen wie die folgenden Beispiele können verwendet werden, um die Formatierung relativ einfach durchzuführen.

function pad(toPad, padWith) {
    return (String(padWith) + String(toPad)).slice(-1 * padWith.length);
}

function dateAsInputValue(toFormat) {
    if(!(toFormat instanceof Date)) return null;
    return toFormat.getFullYear() + "-" + pad(toFormat.getMonth() + 1, "00") + "-" + pad(toFormat.getDate(), "00");
}

function timeAsInputValue(toFormat) {
    if(!(toFormat instanceof Date)) return null;        
    return pad(toFormat.getHours(), "00") + ":" + pad(toFormat.getMinutes(), "00") + ":" + pad(toFormat.getSeconds(), "00");
}

1

Wenn Sie nicht alle Funktionen benötigen, die eine Bibliothek wie Moment.js bietet, können Sie meinen Strftime- Port verwenden . Es ist leicht (1,35 KB gegenüber 57,9 KB im Vergleich zu Moment.js 2.15.0) und bietet den größten Teil der Funktionalität von strftime().

/* Port of strftime(). Compatibility notes:
 *
 * %c - formatted string is slightly different
 * %D - not implemented (use "%m/%d/%y" or "%d/%m/%y")
 * %e - space is not added
 * %E - not implemented
 * %h - not implemented (use "%b")
 * %k - space is not added
 * %n - not implemented (use "\n")
 * %O - not implemented
 * %r - not implemented (use "%I:%M:%S %p")
 * %R - not implemented (use "%H:%M")
 * %t - not implemented (use "\t")
 * %T - not implemented (use "%H:%M:%S")
 * %U - not implemented
 * %W - not implemented
 * %+ - not implemented
 * %% - not implemented (use "%")
 *
 * strftime() reference:
 * http://man7.org/linux/man-pages/man3/strftime.3.html
 *
 * Day of year (%j) code based on Joe Orost's answer:
 * http://stackoverflow.com/questions/8619879/javascript-calculate-the-day-of-the-year-1-366
 *
 * Week number (%V) code based on Taco van den Broek's prototype:
 * http://techblog.procurios.nl/k/news/view/33796/14863/calculate-iso-8601-week-and-year-in-javascript.html
 */
function strftime(sFormat, date) {
  if (!(date instanceof Date)) date = new Date();
  var nDay = date.getDay(),
    nDate = date.getDate(),
    nMonth = date.getMonth(),
    nYear = date.getFullYear(),
    nHour = date.getHours(),
    aDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
    aMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
    aDayCount = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],
    isLeapYear = function() {
      if (nYear&3!==0) return false;
      return nYear%100!==0 || year%400===0;
    },
    getThursday = function() {
      var target = new Date(date);
      target.setDate(nDate - ((nDay+6)%7) + 3);
      return target;
    },
    zeroPad = function(nNum, nPad) {
      return ('' + (Math.pow(10, nPad) + nNum)).slice(1);
    };
  return sFormat.replace(/%[a-z]/gi, function(sMatch) {
    return {
      '%a': aDays[nDay].slice(0,3),
      '%A': aDays[nDay],
      '%b': aMonths[nMonth].slice(0,3),
      '%B': aMonths[nMonth],
      '%c': date.toUTCString(),
      '%C': Math.floor(nYear/100),
      '%d': zeroPad(nDate, 2),
      '%e': nDate,
      '%F': date.toISOString().slice(0,10),
      '%G': getThursday().getFullYear(),
      '%g': ('' + getThursday().getFullYear()).slice(2),
      '%H': zeroPad(nHour, 2),
      '%I': zeroPad((nHour+11)%12 + 1, 2),
      '%j': zeroPad(aDayCount[nMonth] + nDate + ((nMonth>1 && isLeapYear()) ? 1 : 0), 3),
      '%k': '' + nHour,
      '%l': (nHour+11)%12 + 1,
      '%m': zeroPad(nMonth + 1, 2),
      '%M': zeroPad(date.getMinutes(), 2),
      '%p': (nHour<12) ? 'AM' : 'PM',
      '%P': (nHour<12) ? 'am' : 'pm',
      '%s': Math.round(date.getTime()/1000),
      '%S': zeroPad(date.getSeconds(), 2),
      '%u': nDay || 7,
      '%V': (function() {
              var target = getThursday(),
                n1stThu = target.valueOf();
              target.setMonth(0, 1);
              var nJan1 = target.getDay();
              if (nJan1!==4) target.setMonth(0, 1 + ((4-nJan1)+7)%7);
              return zeroPad(1 + Math.ceil((n1stThu-target)/604800000), 2);
            })(),
      '%w': '' + nDay,
      '%x': date.toLocaleDateString(),
      '%X': date.toLocaleTimeString(),
      '%y': ('' + nYear).slice(2),
      '%Y': nYear,
      '%z': date.toTimeString().replace(/.+GMT([+-]\d+).+/, '$1'),
      '%Z': date.toTimeString().replace(/.+\((.+?)\)$/, '$1')
    }[sMatch] || sMatch;
  });
}

Beispielnutzung:

strftime('%F'); // Returns "2016-09-15"
strftime('%A, %B %e, %Y'); // Returns "Thursday, September 15, 2016"

// You can optionally pass it a Date object...

strftime('%x %X', new Date('1/1/2016')); // Returns "1/1/2016 12:00:00 AM"

Der neueste Code ist hier verfügbar: https://github.com/thdoan/strftime


0

Die richtige Methode zum Formatieren eines Datums für die Rückgabe von "2012-12-29" ist das Skript aus dem JavaScript-Datumsformat :

var d1 = new Date();
return d1.format("dd-m-yy");

Dieser Code funktioniert NICHT:

var d1 = new Date();
d1.toString('yyyy-MM-dd');      

3
Sie benötigen das oben verlinkte Skript "JavaScript Date Format"
Sebastian Viereck

0

Persönlich verwende ich die Datumsfunktion von php.js, da ich sowohl PHP als auch jQuery / Javascript gleichermaßen verwende http://phpjs.org/functions/date/

Die Verwendung einer Bibliothek, die dieselben Formatzeichenfolgen verwendet, wie ich sie bereits kenne, ist für mich einfacher, und das Handbuch mit allen Formatzeichenfolgenmöglichkeiten für die Datumsfunktion ist natürlich online unter php.net

Sie fügen einfach die Datei date.js mit Ihrer bevorzugten Methode in Ihren HTML-Code ein und rufen sie dann folgendermaßen auf:

var d1=new Date();
var datestring = date('Y-m-d', d1.valueOf()/1000);

Sie können d1.getTime () anstelle von valueOf () verwenden, wenn Sie möchten, sie tun dasselbe.

Die Division des Javascript-Zeitstempels durch 1000 erfolgt, weil ein Javascript-Zeitstempel in Millisekunden, ein PHP-Zeitstempel jedoch in Sekunden angegeben ist.


0

Viele Frameworks (die Sie möglicherweise bereits verwenden) verfügen über eine Datumsformatierung, die Sie möglicherweise nicht kennen. jQueryUI wurde bereits erwähnt, aber auch andere Frameworks wie Kendo UI (Globalisierung) , Yahoo UI (Util) und AngularJS haben sie.

// 11/6/2000
kendo.toString(new Date(value), "d")

// Monday, November 06, 2000
kendo.toString(new Date(2000, 10, 6), "D")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.