2008-10-28 15 views
10
today1 = new Date(); 
today2 = Date.parse("2008-28-10"); 

Um die Zeit (Millisekunden) Werte dieser zu vergleichen, muss ich folgendes tun, denn heute2 ist nur eine Zahl.Warum gibt Date.parse kein Date-Objekt zurück?

if (today1.getTime() == today2) 

Warum ist das?

+0

Und was ist das Problem darin? Warum musst du es in einem Schritt tun? Gibt es Geschäftsbedarf? – mohammedn

+1

Mein Problem ist, dass ich, und ich bin mir sicher, dass andere erwarten, dass eine Parse-Methode für ein Objekt ein Objekt des Typs, an dem die Methode aufgerufen wird, zurückgibt. – ProfK

Antwort

25

die Frage im Titel zu beantworten: Weil sie so entschieden, wenn die JavaScript-Erstellung Sprache. Vermutlich, weil Javas java.util.Date Parse-Funktion das Gleiche tat und sie ihr Verhalten nachahmen wollten, um die Sprache vertrauter zu machen.

die Frage im Text zu beantworten ... Mit diesem Konstrukt zwei Datumsobjekte erhalten:

var today2 = new Date(Date.parse("2008-10-28")); 

EDIT: Ein einfaches

var today2 = new Date("2008-10-28"); 

funktioniert auch.

Hinweis dass Internet Explorer (d. H. JScript) Bindestriche in der Datumszeichenfolge nicht versteht. Es arbeitet mit Schrägstrichen, aber:

var today2 = new Date("2008/10/28"); 
+1

Die Mitte ist der Monat und der dritte ist Datum? –

+4

@ Derek: Ja. Das ist die einzige Datumsnotation, die irgendeinen Sinn ergibt. – Tomalak

4

Wenn ich mich richtig erinnere, gibt Datum einen Wert bis zu der Millisekunde, die Sie das Date-Objekt erstellt haben. Also, wenn dieser Code nicht genau auf 2008-28-10 um 00: 00: 00: 000 läuft, werden sie nicht identisch sein.

Nur ein Zusatz: Date.parse() gibt per Definition einen langen Wert zurück, der den Millisekundenwert des Datums und nicht das Date-Objekt selbst darstellt. Wenn Sie das Date-Objekt selbst halten wollen, baut es nur etwa so:

var newDate = new Date(); 
newDate.setFullYear(2008,9,28); 

Weitere Referenz Check-out: the Date class reference

+0

Das beantwortet nicht die ursprüngliche Frage, die - umformuliert - war "Warum ist der Typ, von Date.parse zurückgegeben, eine ganze Zahl, anstatt ein Datum?". Ich kenne die Antwort auch nicht, aber lehne die Gelegenheit ab, eine falsche Antwort als Alternative anzubieten. – belugabob

+0

Wie ich hinzugefügt habe, gibt Date.parse by def den Millisekundenwert zurück, siehe die Referenz, mit der ich verlinkt bin ... –

1

Was Data.parse kehrt ein NaN ist. Was ist eigentlich eine unbestimmte Anzahl? Dies wird von den meisten Implementierungen zurückgegeben, wenn die Zeichenfolge nicht in ein Datum konvertiert werden kann. Einige Implementierungen kommen mit nichts anderem als einer RFC 1123 kompatiblen Datumsstrings zurecht (was alles ist, was die Spezifikation erfordert).

Bearbeiten: Ein Kommentar zu dieser Antwort besagt, dass Date.parse NaN nicht zurückgibt. Die Spezifikation besagt jedoch, dass parse eine Zahl zurückgeben soll. Welche Nummer sollte es zurückgeben, wenn eine Zeichenfolge eingegeben wird, die nicht als Datum analysiert werden kann? Es kann nicht 0 oder -1 oder irgendeinen anderen "Rogue" -Wert verwenden, da dies eine gültige Millisekundenverschiebung vom 1. Januar 1970 ist. Mozilla und IE geben beide NaN zurück, was eine vollkommen sinnvolle Sache ist.

Während die Spezifikation nicht das Parsen einer Zeichenfolge wie "2008-28-10" zu einem gültigen Datum ausschließt, ist es nicht erforderlich. Ich bin auf keine Implementierungen gestoßen, die mehr als in der Spezifikation erforderlich machen. Daher ist "Oct 10, 2008" das nächste, was du zu der darüber liegenden Saite bekommen wirst, die richtig parsen wird.

+0

Date.sparse gibt kein NaN zurück. – ProfK

+0

Versuchen Sie es. Gib es "2008-28-10" wie in der Frage und teste mit isNaN. – AnthonyWJones

+0

Tut mir leid, ich habe "Frage Box" Codierung und verwendet das falsche Datumsformat. Du hättest darauf hinweisen können, dass mein spezielles Date.parse() ein Nan zurückgegeben hat. – ProfK

2

Ich kann nicht anstelle der Sprachdesigner antworten, aber Sie können das Ergebnis von Date.parse oder Date.UTC im Date-Konstruktor verwenden, um ein solches Objekt zu erhalten.

Beachten Sie, dass Ihr Codebeispiel falsch ist: Es ist kein gültiges Datumsformat, weder ISO (JJJJ-MM-TT) noch IETF (Montag, 25. Dezember 1995 13:30:00 GMT + 0430). Du wirst also ein NaN bekommen. Date.parse verstehen nur IETF-Format, von dem, was ich auf MDC gelesen habe.

Wenn Sie zwei Daten vergleichen müssen, können Sie die Ergebnisse von .getFullYear(), .getMonth() und .getDay() vergleichen oder einfach die Zeichenfolgendarstellungen auf der gewünschten Ebene vergleichen.

var d1 = new Date(); 
var n = Date.parse("28 Oct 2008"); 
var d2 = new Date(n); 
var d3 = new Date("28 october 2008"); 

alert(d1.toDateString() == d2.toDateString()); 
alert(d2.toDateString() == d3.toDateString()); 
Verwandte Themen