Warum argument für den Monat von 0 bis 11 reichen in JavaScript-Date-Konstruktor?
Beim initialisieren eines neuen Date
- Objekt in JavaScript mit Hilfe der unten rufen, fand ich heraus, dass die Monat-argument zählt ab null.
new Date(2010, 3, 1); //that's the 1st April 2010!
Warum argument für den Monat start von 0? Auf der anderen Seite, der Tag des Monats argument (letzten) ist eine Zahl von 1 bis 31. Gibt es gute Gründe dafür?
InformationsquelleAutor der Frage Agnel Kurian | 2010-03-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist eine alte (wahrscheinlich unglücklich, wohl zu sterben) tradition in der Programmierung Welt, sehen Sie den alten standard (POSIX) localtime C-Funktion http://linux.die.net/man/3/localtime
InformationsquelleAutor der Antwort leonbloy
Die wirkliche Antwort auf diese Frage, ist, dass es kopiert wurde von
java.util.Date
die hatte auch diese Marotte. Der Nachweis kann werden gefunden auf Twitter von Brendan Eich - der Mann, der ursprünglich implementierten JavaScript (einschließlich derDate
Objekt):https://twitter.com/BrendanEich/status/481939099138654209
https://twitter.com/BrendanEich/status/771006397886533632
Dies geschah im Jahr 1995, und das JDK 1.0 war in der beta. Es startete im Jahr 1996. 1997 JDK 1.1 kam die Missbilligte die überwiegende Mehrheit der Funktionen auf
java.util.Date
bewegen Sie überjava.util.Calendar
aber selbst das hatte immer noch null-basierten Monate. Entwickler fed-up mit diesem erstellt die Joda-Time Bibliothek, die letztlich führte zujava.time
Paket, das gebacken zu Java 8 (2014).Kurz gesagt, es dauerte 18 Jahre, für Java eine ordnungsgemäß entworfene Datum/Zeit-API eingebaut, aber JavaScript ist immer noch nicht zurück in das dunkle Mittelalter. Wir tun in der Tat haben ausgezeichnete Bibliotheken, wie Moment.jsDatum-fnsund js-joda. Aber jetzt ist es nichts mehr als
Date
eingebaut, um die Sprache. Hoffentlich wird dies in Naher Zukunft ändern.InformationsquelleAutor der Antwort Matt Johnson
Alles, aber der Tag, der Monat ist 0-basiert, sehen Sie hier für eine vollständige Liste, inklusive der Bereiche 🙂
Es ist eigentlich das 1 Tage, sind die Sonderlinge hier...seltsam genug. Warum wurde dies gemacht wurde? Ich weiß nicht...aber wahrscheinlich passiert das gleiche treffen Sie bekam verputzt und beschlossen, Semikolons optional.
InformationsquelleAutor der Antwort Nick Craver
Gibt es immer 12 Monate im Jahr, so früh C-Implementierungen möglicherweise verwendet haben, eine statische Feste-Breite-array mit Indizes 0..11.
InformationsquelleAutor der Antwort Jonathan Julian
Sein, wie dies in java auch.. Wahrscheinlich zum konvertieren von int zu string (0 jan,, 1-feb), die Sie kodiert diese Weise.. weil Sie vielleicht ein array der Zeichenkette (indiziert von 0) der Namen für den Monat und diesen Monat zahlen, wenn Sie beginnen bei 0, es werden viel einfacher, die Karte zu dem Monat, strings..
InformationsquelleAutor der Antwort raj
Ich weiß, es ist nicht wirklich eine Antwort auf die ursprüngliche Frage, aber ich wollte nur, um Ihnen zu zeigen meine bevorzugte Lösung für dieses problem, die ich nie scheinen zu merken, wie es erscheint, von Zeit zu Zeit.
Kleine Funktion zerofill funktioniert der trick füllen die Nullen benötigt, und der Monat ist gerade
+1
Hinzugefügt:Aber ja, Datum ist ziemlich unintuitiv API, habe ich gelacht, als ich gelesen habe Brendan Eich über Twitter.
InformationsquelleAutor der Antwort Christof Kälin
Könnten Sie betrachtet habe Monate eine Aufzählung (erste index 0) und den Tagen nicht, da Sie nicht über einen Namen mit Ihnen verbunden.
Oder vielmehr, dachte Sie, die Nummer des Tages war die tatsächliche Darstellung des Tages (auf die gleiche Weise werden die Monate als zahlen dargestellt, in einem Datum wie 12/31), als wenn Sie könnten eine Aufzählung mit zahlen als Variablen, aber eigentlich 0-basiert.
Also eigentlich für die nächsten Monate, vielleicht dachten Sie, das richtige Aufzählung Darstellung wäre, um die Monats-Namen, statt Nummern, und Sie hätten das gleiche getan, wenn die Tage hatte einen Namen Darstellung. Stell dir vor, wir würden sagen, dass im Januar Fünf, den Sechsten Januar, statt des 5. Januar, 6. Januar, usw., dann vielleicht möchten Sie ja gemacht haben, einen 0-basierten enumeration für Tage zu...
Vielleicht unterbewusst dachte Sie über eine enumeration für die Monate {Januar, Februar, ...} und für Tage wie {Eins, Zwei, Drei, ...}, außer für die Tage, die Sie Zugriff auf die Tag-Nummer statt der name, wie 1 für Einen, etc., also unmöglich zu starten bei 0...
InformationsquelleAutor der Antwort Pat-Laugh
Ist es vielleicht ein Fehler, aber es ist auch sehr praktisch, wenn Sie möchten, zu vertreten, die Monate oder Tag der Woche als ein string ist, können Sie einfach erstellen Sie ein array wie ['jan'feb' ...usw][new Date().getMonth()] an Stelle von [", "jan", Jan ...usw][new Date().getMonth()] oder ['jan','feb', ...etc][new Date().getMonth()-1]
Tage des Monats sind in der Regel nicht benannt, so dass Sie nicht machen werden arrays mit Namen für die. In diesem Fall 1-31 ist einfacher zu handhaben, so dass Sie wollen, haben, subtrahieren Sie 1 jedes mal...
InformationsquelleAutor der Antwort Rogier