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


Ich habe bemerkt, dass JavaScript ist new Date() Funktion ist sehr schlau, 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 Dokumentation finden, die alle gültigen String-Formate beim Aufruf zeigte new Date() Funktion.

Dies ist zum Konvertieren einer Zeichenfolge in ein Datum. Wenn wir auf die entgegengesetzte Seite schauen, also ein Datumsobjekt in eine Zeichenkette umwandeln, hatte ich bisher den Eindruck, dass JavaScript keine eingebaute API hat, um ein Datumsobjekt in eine Zeichenkette zu formatieren.

Anmerkung der Redaktion: Der folgende Ansatz ist der Versuch des Fragestellers, der bei einem bestimmten Browser funktioniert hat, aber dies tut nicht Arbeit im Allgemeinen; Siehe die Antworten auf dieser Seite um einige aktuelle Lösungen zu sehen.

Heute habe ich mit der gespielt toString() Methode für das date-Objekt und dient überraschenderweise dazu, Datumsangaben für Strings 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 zu allen Möglichkeiten finden, wie wir das Datumsobjekt in einen String formatieren können.

Wo ist die Dokumentation, in der die von der Date() Objekt?


1293
2018-06-29 05:46


Ursprung


Antworten:


ich liebe 10 Möglichkeiten, Zeit und Datum mit JavaScript zu formatieren und Mit Daten arbeiten.

Grundsätzlich haben Sie drei Methoden und müssen die Strings 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);


1010
2018-04-12 07:18



Moment.js

Es ist eine (leichte) JavaScript-Datebibliothek zum Parsen, Bearbeiten und Formatieren von Daten.

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"

(*) leichte Bedeutung 9.3KB verkleinert + gezippt im kleinstmöglichen Setup (Feb 2014) 


670
2017-08-11 07:27



Wenn Sie bereits verwenden jQuery Benutzeroberfläche In Ihrem Projekt 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.

Schau es dir an jQuery UI datepicker formatDatum, die Beispiele.


419
2017-08-03 16:55



Wo ist die Dokumentation, in der die von der Date() Objekt?

Ich bin heute darüber gestolpert und war ziemlich überrascht, dass sich niemand die Zeit genommen hat, diese einfache Frage zu beantworten. Es stimmt, dass es viele Bibliotheken gibt, die bei der Manipulation von Daten helfen. Manche sind besser als andere. Aber das war nicht die Frage, die gestellt wurde.

AFAIK, reines JavaScript unterstützt keine Formatspezifizierer wie du angegeben hast, dass du sie gerne benutzen würdest. Aber es unterstützt Methoden zum Formatieren von Daten und / oder Zeiten, wie z .toLocaleDateString(), .toLocaleTimeString(), und .toUTCString().

Das Date Objektreferenz, die ich am häufigsten verwende, ist auf der w3schools.com Website (aber eine schnelle Google-Suche wird viel mehr enthüllen, die vielleicht besser Ihren Bedürfnissen entsprechen).

Beachten Sie auch, dass die Eigenschaften des Datumsobjekts Abschnitt bietet einen Link zu prototypeDies veranschaulicht, wie Sie das Date-Objekt um benutzerdefinierte Methoden erweitern können. Da war einige Debatte in der JavaScript-Community über die Jahre darüber, ob dies die beste Praxis ist oder nicht, und ich befürworte nicht für oder dagegen, ich weise nur auf seine Existenz hin.


215
2018-05-21 12:48



Benutzerdefinierte Formatierungsfunktion:

Für feste Formate, eine einfache Funktion machen den Job. Folgendes Beispiel erzeugt das internationale Format YYYY-MM-DD:

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. indem Sie diese Funktion dem Prototyp von Date hinzufügen).

Eine erweiterte Funktion könnte eine konfigurierbare Ausgabe basierend auf einem Formatparameter erzeugen. Es gibt ein paar gute Beispiele auf dieser Seite.

Wenn das Schreiben einer Formatierungsfunktion zu lange dauert, gibt es eine Menge Bibliotheken, die das tun. Einige andere Antworten listen sie bereits auf. Aber zunehmende Abhängigkeiten haben auch einen Gegenpart.

Standard-ECMAScript-Formatierungsfunktionen:

Seit neueren Versionen von ECMAscript, der Date Die Klasse hat einige spezifische Formatierungsfunktionen:

toDateString: Implementierungsabhängig, zeige nur das Datum an.

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: Zeigt ISO 8601 Datum und Uhrzeit an.

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"

zuJSON: Zeichenkette 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, ein Datum und eine 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"

zuString: Generisch toString for Date.

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

200
2017-07-02 20:07



Die kurze Antwort

Es gibt keine "universelle" Dokumentation, die JavaScript unterstützt; Jeder Browser, der Javascript hat, 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 minimal eine modifizierte Implementierung der ISO 8601-Definition erfordern.

Darüber hinaus gibt es einen zweiten Standard, der von der IETF dass Browser auch dazu neigen, zu folgen, was die Definition von Zeitstempeln im RFC 2822 ist. Die tatsächliche Dokumentation findet sich in der Referenzliste unten.

Daraus kann man grundlegende Funktionalität erwarten, aber was "sein sollte" ist nicht von Natur aus was "ist". Ich werde ein wenig in die Tiefe gehen, aber es scheint, dass nur drei Leute die Frage beantwortet haben (Scott, GoofballLogic und Peller), was für mich darauf hindeutet, dass die meisten Menschen nicht wissen, was tatsächlich passiert Erstellen Sie ein Date-Objekt.


Die lange Antwort

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


Um die Frage zu beantworten oder in der Regel sogar nach der Antwort auf diese Frage zu suchen, müssen Sie wissen, dass JavaScript keine neue Sprache ist. Es ist eigentlich eine Implementierung von ECMAScript und folgt den ECMAScript-Standards (aber beachten Sie, dass Javascript auch diesen Standards vorausging; die Standards von EMCAScript basieren auf der frühen Implementierung von LiveScript / JavaScript). Der aktuelle ECMAScript-Standard ist 5.1 (2011); Zu der Zeit, als die Frage ursprünglich gestellt wurde (Juni '09), war die Norm 3 (4 wurde aufgegeben), aber 5 wurde kurz nach der Stelle Ende 2009 veröffentlicht. Dies sollte ein Problem skizzieren; Welcher Standard eine JavaScript-Implementierung möglicherweise folgt, spiegelt möglicherweise nicht wider, was tatsächlich vorhanden ist, denn a) es ist eine Implementierung eines bestimmten Standards, b) nicht alle Implementierungen eines Standards sind puritanisch, und c) Funktionalität wird nicht in Synchronisation mit einem freigegeben neuer Standard als d) eine Implementierung ist eine ständige Arbeit in Arbeit

Im Wesentlichen handelt es sich bei JavaScript um ein Derivat (javascript-spezifisch für den Browser) einer Implementierung (Javascript selbst). Google V8 implementiert zum Beispiel ECMAScript 5.0, Internet Explorer JScript versucht jedoch nicht, einem ECMAScript-Standard zu entsprechen, aber Internet Explorer 9 entspricht ECMAScript 5.0.

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

new Date(value)

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

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


Beide Funktionen sollten bekannt sein, aber das beantwortet nicht sofort Ihre Frage und was als ein akzeptables "Datumsformat" quantifiziert wird, bedarf weiterer Erläuterung. Wenn Sie eine Zeichenfolge an new Date () übergeben, wird der Prototyp aufgerufen (beachten Sie, dass ich das Wort verwende Prototyp lose; die Versionen können einzelne Funktionen sein, oder sie können Teil einer bedingten Anweisung in einer einzigen Funktion sein neues Datum (Wert) mit Ihrer Zeichenfolge als Argument für den Parameter "Wert". Diese Funktion überprü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 ableiten, dass wir die Methode Date.parse (string) betrachten müssen, um die für ein neues Date (value) zulässige String-Formatierung 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 weiterhin folgern, dass Daten in einem modifizierten ISO 8601 Extended Format vorliegen, wie hier angegeben:

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

Wir können jedoch aus Erfahrung erkennen, dass das Date-Objekt von javascript andere Formate akzeptiert (durch die Existenz dieser Frage an erster Stelle erzwungen), und das ist in Ordnung, weil ECMAScript implementierungsspezifische Formate zulässt. Dies beantwortet jedoch immer noch nicht die Frage, welche Dokumentation in den verfügbaren Formaten verfügbar ist und welche Formate tatsächlich erlaubt sind. Wir werden uns die JavaScript-Implementierung von Google ansehen, V8; Bitte beachten Sie, ich schlage nicht vor, dies ist die "beste" Javascript-Engine (wie kann man "am besten" oder sogar "gut" definieren) und man kann nicht annehmen, dass die Formate in V8 alle verfügbaren Formate darstellen, aber ich denke, es ist fair anzunehmen, dass sie 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 die DateConstructor-Funktion betrachten, können wir folgern, dass wir die DateParse-Funktion finden müssen; Beachten Sie jedoch, dass "Jahr" nicht das tatsächliche Jahr ist und nur eine Referenz auf den Parameter "Jahr" ist.

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, um den es in dieser Funktion geht, ist für DateParser :: Parse (); Ignoriere die Logik, die diese Funktionsaufrufe umgibt, dies sind nur Überprüfungen, die dem Kodierungstyp (ASCII und UC16) 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, und wenn es nicht standardkonform ist, wird versucht, das Datum basierend auf Legacy-Formaten zu erstellen. Einige wichtige Punkte basierend auf den Kommentaren:

  1. Wörter vor der ersten Zahl, die dem Parser nicht bekannt sind, werden ignoriert.
  2. Eingeklammerter Text wird ignoriert.
  3. Vorzeichenlose Zahlen gefolgt von ":" werden als "Zeitkomponente" interpretiert.
  4. Zahlen ohne Vorzeichen gefolgt von "." Werden als "Zeitkomponente" interpretiert und müssen in Millisekunden angegeben werden.
  5. Signierte Zahlen gefolgt von der Stunden- oder Stundenminute (z.B. +5: 15 oder +0515) werden als die Zeitzone interpretiert.
  6. Wenn Sie die Stunde und Minute deklarieren, 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 übereinstimmende ")" sind nicht erlaubt, nachdem eine Nummer verarbeitet wurde.
  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 erwarten können, wenn Sie eine Zeichenfolge in ein Date-Objekt übergeben. Sie können dies weiter vertiefen, indem Sie sich die folgende Spezifikation ansehen, auf die Mozilla im Mozilla Developer Network verweist (konform zu 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 Internationalisierungs-API-Spezifikation, die den ECMAScript 5.1-Standard (und zukünftige) ergänzt. Das kann hier gefunden werden:

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

In jedem Fall sollte dies dazu beitragen, zu verdeutlichen, dass es keine "Dokumentation" gibt, die universell alle Implementierungen von JavaScript repräsentiert, aber es gibt immer noch genügend Dokumentation, um vernünftig zu zeigen, welche Strings für ein Date-Objekt akzeptabel sind. Ganz die belastete Frage, wenn man darüber nachdenkt, 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


121
2017-11-19 11:31



Vergewissern Sie sich, dass Sie auschecken Datejs beim Umgang mit Daten in JavaScript. Es ist ziemlich beeindruckend und gut dokumentiert, wie Sie im Falle der toString-Funktion.

BEARBEITEN: Tyler Forsythe weist darauf hin, dass datejs veraltet ist. Ich benutze es in meinem aktuellen Projekt und hatte keine Probleme damit, aber Sie sollten sich dessen bewusst sein und Alternativen in Erwägung ziehen.


91
2017-09-07 03:23



Du kannst einfach das erweitern Date Objekt mit einem neuen format Methode wie von Meizz, unten ist der Code vom Autor angegeben. Und hier ist ein jsfiddle.

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

68
2017-08-31 09:59



Die von Ihnen zitierte Funktionalität ist kein Standard-JavaScript, wahrscheinlich nicht über Browser hinweg portierbar und daher keine gute Praxis. Das ECMAScript 3 spec überlässt die Parse- und Ausgabeformate der Javascript-Implementierung. ECMAScript 5 fügt eine Teilmenge der ISO8601-Unterstützung hinzu. Ich glaube die toString () Funktion, die Sie erwähnen, ist eine Innovation in einem Browser (Mozilla?)

Mehrere Bibliotheken stellen Routinen zur Verfügung, um dies zu parametrisieren, einige mit umfangreicher Lokalisierungsunterstützung. Sie können auch die Methoden in dojo.date.locale.


35
2018-01-17 22:19