2017-04-19 2 views
3

auf Monats-Format basiert Während meine Anwendung Debuggen ich seltsame Sache gefunden:Javascript Datum unterscheidet

new Date('2017-5-19') -> Fri May 19 2017 00:00:00 GMT+0300 (FLE Summer Time) 
new Date('2017-05-19') -> Fri May 19 2017 03:00:00 GMT+0300 (FLE Summer Time) 

I festgelegten Zeitpunkt aus String, wie '2017-5-19', aber wenn gibt es Null vor Monatsnummer, das Datum ist anders als ohne Null .

Wie kann ich das gleiche Ergebnis durch 5 und 05 Eingänge erreichen?

p.s. Ich muss strengen Modus unterstützen

+0

Nach dem bestehende Logik für Daten, scheint es, dass, wenn Sie das Format, das erwartet wird trotzen Es konvertiert nicht den Wert von Ihrer Utc in Ihre lokale Zeitzone. Also '2017-05-19' ist das richtige Format 'yyyy-mm-dd' konvertiert in Ihre lokale Zeitzone. Hilft das? –

+0

@ PansulBhatt-nach [* ECMA-262 *] (http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date-time-string-format), ein Datum in das Format YYYY-MM-DD sollte als UTC behandelt werden, nicht lokal (aber natürlich nicht alle verwendeten Browser). – RobG

Antwort

3

Wie auf MDN angezeigt, ist die Verwendung des Date-Konstruktors zum Parsen von Daten aufgrund von Implementierungsunterschieden entmutigt.

Wenn Sie dies jedoch wirklich tun möchten, ist die einzige Lösung sicherzustellen, dass die von Ihnen bereitgestellten Eingaben konsistent sind. Dies stellt sicher, dass (zumindest in einer einzelnen Umgebung) die Ausgaben konsistent sind.

Um beide arbeiten wie 2017-5-19 haben:

function adjustDateString(str) { 
 
    return str.split('-').map(Number).join('-'); 
 
} 
 

 
console.log(new Date(adjustDateString('2017-5-19'))) 
 
console.log(new Date(adjustDateString('2017-05-19')))

Um beide arbeiten wie 2017-05-19 zu haben:

function padTo2Digits(str) { 
 
    return str.length >= 2 ? str : '0' + str; 
 
} 
 

 
function adjustDateString(str) { 
 
    return str.split('-').map(padTo2Digits).join('-'); 
 
} 
 

 
console.log(new Date(adjustDateString('2017-5-19'))) 
 
console.log(new Date(adjustDateString('2017-05-19')))

Edit: Allerdings sind Sie wahrscheinlich besser dran, wie ich oben erwähnt, nicht mit dem Date Konstruktor auf einer Zeichenfolge. spaltete es nur in ihren Werten und denen in den Konstruktor:

function parseDate(str) { 
 
    var parts = str.split('-').map(Number); 
 

 
    return new Date(parts[0], parts[1], parts[2]); 
 
} 
 

 
console.log(parseDate('2017-5-19')); 
 
console.log(parseDate('2017-05-19'));

Verwendung Array deconstructuring Syntax (erfordert ES6 +):

function parseDate(str) { 
 
    let [year, month, day] = str.split('-').map(Number); 
 

 
    return new Date(year, month, day); 
 
} 
 

 
console.log(parseDate('2017-5-19')); 
 
console.log(parseDate('2017-05-19'));

+0

Mit vielen Dank! – vladdihoney

+0

Versuchen Sie immer noch, die Logik des Analysierens einer Zeichenfolge zu Werten zu berechnen, und erstellen Sie dann eine weitere Zeichenfolge, die von einem anderen Parser analysiert werden soll. Warum analysieren Sie es nicht ** einmal ** und geben Sie die Werte direkt dem Date-Konstruktor? Beachten Sie Ihren ersten Satz: "Es wird abgeraten *, den Datumskonstruktor zum Analysieren von Daten zu verwenden". ;-) – RobG

+0

@RobG Messepunkt. Ich habe einen Nachtrag hinzugefügt. – JLRishe