2017-01-02 6 views
0

Ich benutze die JavaScript-Funktion der Date-Klasse toLocaleDateString() in einem Projekt, um die richtige Formatierung entsprechend dem Gebietsschema des Benutzers zu erhalten, so einfach. Der Tag des Monats ist jedoch nicht immer richtig (es ist manchmal ein Tag weniger als erwartet). Ich kann nicht verstehen, warum das passiert.Falsches Datum mit JavaScript-Funktion toLocaleDateString()

Ich baute eine jfiddle, um das Problem zu zeigen. Es tritt mit dem Monat Oktober auf. Das Datum 3 sein sollte wie in allen anderen Monaten, aber irgendwie ist es 2.

https://jsfiddle.net/vincepunkrock/nh1u3ord/

Hier ist der wichtige Teil des Codes ist und das Ergebnis (Mein locale ist ‚de‘):

for(var i = 0; i < 12; i++) 
{ 
    var d = new Date(1993,i,3); 
    var n = d.toLocaleDateString(); 
    document.getElementById("demo").innerHTML += n + "<br>"; 
} 

3.1.1993 
3.2.1993 
3.3.1993 
3.4.1993 
3.5.1993 
3.6.1993 
3.7.1993 
3.8.1993 
3.9.1993 
2.10.1993 
3.11.1993 
3.12.1993 

Habt ihr eine Vorstellung davon, was hier passiert und was kann ich tun, um es zu lösen?

Vielen Dank!

+2

Wann endete "Sommerzeit" (oder "Sommerzeit") 1993 in Ihrem Land? – Pointy

+0

Es war am Sept. 26.. In der Tat, wenn ich den Termin auf den 27. setze, bekomme ich den 26. für die Monate September und Oktober. Du warst auf dem richtigen Weg! –

+0

"* ... um die richtige Formatierung entsprechend der Ländereinstellung des Benutzers zu erhalten ... *". Es gibt keine Garantie, dass dies geschieht, da * toLocaleDateString * vollständig von der Implementierung abhängig ist und einige Implementierungen die Benutzereinstellungen vollständig zu ignorieren scheinen. – RobG

Antwort

1

Ich denke, Pointy hat es mit seinem Kommentar genagelt. toLocalDateString rechnet definitiv DST mit einer angenommenen Stunde von 00: 00: 0000 ein, da es nicht spezifiziert wird, so dass die "Rückfall" -Stunde in den vorherigen Tag geht. Ich bin mir nicht sicher, was dein Standort ist, dass nur in einem Monat passiert, aber ich bin kein Profi in Zeitzonen. Das Skript funktioniert perfekt für mich.

Update: Stellen Sie die "Zeit" in Ihrem neuen Datum auf die Mitte des Tages, wenn dies nicht das Verhalten ist, das Sie wollen .. dann wird die Sommerzeit-Anpassung nicht zu verschiedenen Daten hin und her.

var d = new Date(1993,i,3, 12,30,30,30); 
+0

Wie die Änderung der Sommerzeit an den genauen Zeitpunkt der Änderung gehandhabt wird, variiert zwischen den Implementierungen. Es sollte ausreichend sein, die Stunden auf eine Stunde oder mehrere Stunden nach Mitternacht zu setzen, da sich nirgendwo mehr als eine Stunde ändert (einige haben weniger), so dass "neues Datum (1993, i, 3,1)" ausreichend sein sollte . ;-) – RobG

0

Funktioniert für mich mit französischer Sprache zuerst. Es scheint, dass die Spracheinstellungen Ihres Browsers die Ergebnisse auf seltsame Weise beeinflussen. Überprüfen Sie die Spracheinstellungen Ihres Browsers.

+0

Die Verwendung von "Locale" im Methodennamen ist eine falsche Bezeichnung. Die * toLocaleString * -Methoden sind vollständig implementierungsabhängig und berücksichtigen nicht "locale", da sie sonst die Formatierung der Zeichenfolge basierend auf dem geografischen Standort des Geräts ändern, nicht die Benutzereinstellungen (was sie tatsächlich zu tun scheinen, wenn sie benutzen überhaupt irgendetwas). – RobG