new Date(Date.parse("Jul 8, 2005"));
Παρ Ιουλ 08 2005 00:00:00 GMT-0700 (PST)
new Date(Date.parse("2005-07-08"));
Πέμ Ιουλ 07 2005 17:00:00 GMT-0700 (PST)
<hr />,
Γιατί η δεύτερη ανάλυση είναι λανθασμένη;
Μέχρι να κυκλοφορήσει η προδιαγραφή της 5ης έκδοσης, η μέθοδος Date.parse
ήταν εντελώς εξαρτώμενη από την υλοποίηση (η μέθοδος new Date(string)
είναι ισοδύναμη με την Date.parse(string)
, εκτός από το ότι η τελευταία επιστρέφει έναν αριθμό αντί για μια Ημερομηνία
). Στην προδιαγραφή της 5ης έκδοσης προστέθηκε η απαίτηση για την υποστήριξη ενός απλοποιημένου (και ελαφρώς λανθασμένου) ISO-8601 (δείτε επίσης What are valid Date Time Strings in JavaScript?). Αλλά εκτός από αυτό, δεν υπήρχε καμία απαίτηση για το τι θα έπρεπε να δέχεται το Date.parse
/ new Date(string)
εκτός από το ότι έπρεπε να δέχονται ό,τι Date#toString έβγαζε (χωρίς να λέει τι ήταν αυτό).
Από το ECMAScript 2017 (έκδοση 8), οι υλοποιήσεις έπρεπε να αναλύουν την έξοδό τους για Date#toString και Date#toUTCString, αλλά η μορφή αυτών των συμβολοσειρών δεν καθοριζόταν.
Από το ECMAScript 2019 (έκδοση 9), η μορφή για Date#toString και Date#toUTCString, έχει καθοριστεί ως (αντίστοιχα):
παρέχοντας 2 ακόμη μορφές που η Date.parse θα πρέπει να αναλύει αξιόπιστα σε νέες υλοποιήσεις (σημειώνοντας ότι η υποστήριξη δεν είναι πανταχού παρούσα και μη συμβατές υλοποιήσεις θα παραμείνουν σε χρήση για κάποιο χρονικό διάστημα).
Θα συνιστούσα να αναλύονται χειροκίνητα οι συμβολοσειρές ημερομηνιών και να χρησιμοποιείται ο Date constructor με ορίσματα έτος, μήνα και ημέρα για να αποφεύγεται η ασάφεια:
// parse a date in yyyy-mm-dd format
function parseDate(input) {
var parts = input.split('-');
// new Date(year, month [, day [, hours[, minutes[, seconds[, ms]]]]])
return new Date(parts[0], parts[1]-1, parts[2]); // Note: months are 0-based
}
Υπάρχει κάποια μέθοδος στην τρέλα. Ως γενικός κανόνας, αν ένα πρόγραμμα περιήγησης μπορεί να ερμηνεύσει μια ημερομηνία ως ISO-8601, θα το κάνει. Η "2005-07-08" εμπίπτει σε αυτό το στρατόπεδο, και έτσι αναλύεται ως UTC. Η "8 Ιουλίου 2005" δεν μπορεί, και έτσι αναλύεται στην τοπική ώρα.
Δείτε JavaScript and Dates, What a Mess! για περισσότερα.
Αν και το CMS έχει δίκιο ότι το πέρασμα συμβολοσειρών στη μέθοδο ανάλυσης δεν είναι γενικά ασφαλές, η νέα προδιαγραφή ECMA-262 5th Edition (γνωστή και ως ES5) στην ενότητα 15.9.4.2 υποδεικνύει ότι η Date.parse()
θα πρέπει να χειρίζεται ημερομηνίες με μορφοποίηση ISO. Η παλαιά προδιαγραφή δεν προέβαλλε τέτοιο ισχυρισμό. Φυσικά, τα παλιά προγράμματα περιήγησης και ορισμένα τρέχοντα προγράμματα περιήγησης εξακολουθούν να μην παρέχουν αυτή τη λειτουργικότητα της ES5.
Το δεύτερο παράδειγμά σας δεν είναι λάθος. Είναι η καθορισμένη ημερομηνία σε UTC, όπως υπονοείται από την Date.prototype.toISOString()
, αλλά αναπαρίσταται στην τοπική σας ζώνη ώρας.