Σχεδόν κάθε είδους εφαρμογή γραμμένη σε JavaScript λειτουργεί με ώρες ή ημερομηνίες σε κάποια χωρητικότητα. Στην αρχή, αυτό περιοριζόταν στο ενσωματωμένο Date API. Αυτό το API περιλαμβάνει βασικές λειτουργίες, αλλά είναι αρκετά περιορισμένο στο τι μπορεί να κάνει. Βιβλιοθήκες τρίτων, όπως το Moment.js, και αργότερα ενσωματωμένα API, όπως τα Intl API και το νέο Temporal API, προσθέτουν πολύ μεγαλύτερη ευελιξία στην εργασία με ώρες και ημερομηνίες. The Rise And Fall Of Moment.js Το Moment.js είναι μια βιβλιοθήκη JavaScript με ισχυρά βοηθητικά προγράμματα για εργασία με ώρες και ημερομηνίες. Περιλαμβάνει λειτουργίες που λείπουν από το βασικό Date API, όπως η χειραγώγηση ζώνης ώρας, και κάνει απλούστερες πολλές κοινές λειτουργίες. Το Moment περιλαμβάνει επίσης λειτουργίες για τη μορφοποίηση ημερομηνιών και ωρών. Έγινε μια ευρέως χρησιμοποιούμενη βιβλιοθήκη σε πολλές διαφορετικές εφαρμογές. Ωστόσο, και το Moment είχε το μερίδιό του. Είναι μια μεγάλη βιβλιοθήκη και μπορεί να προσθέσει σημαντικά το μέγεθος του πακέτου μιας εφαρμογής. Επειδή η βιβλιοθήκη δεν υποστηρίζει ανακίνηση δέντρων (μια δυνατότητα σύγχρονων bundler που μπορούν να αφαιρέσουν αχρησιμοποίητα μέρη βιβλιοθηκών), περιλαμβάνεται ολόκληρη η βιβλιοθήκη του Moment, ακόμα κι αν χρησιμοποιείτε μόνο μία ή δύο από τις λειτουργίες της. Ένα άλλο ζήτημα με το Moment είναι το γεγονός ότι τα αντικείμενα που δημιουργεί είναι μεταβλητά. Η κλήση ορισμένων συναρτήσεων σε ένα αντικείμενο Moment έχει παρενέργειες και μεταλλάσσει την τιμή αυτού του αντικειμένου. Αυτό μπορεί να οδηγήσει σε απροσδόκητη συμπεριφορά ή σφάλματα. Το 2020, οι συντηρητές του Moment αποφάσισαν να θέσουν τη βιβλιοθήκη σε λειτουργία συντήρησης. Δεν γίνεται ανάπτυξη νέων χαρακτηριστικών και οι συντηρητές συνιστούν να μην το χρησιμοποιείτε για νέα έργα. Υπάρχουν άλλες βιβλιοθήκες ημερομηνιών JavaScript, όπως το date-fns, αλλά υπάρχει ένα νέο πρόγραμμα αναπαραγωγής στην πόλη, ένα API ενσωματωμένο απευθείας στο JavaScript: Temporal. Είναι ένα νέο πρότυπο που συμπληρώνει τις τρύπες του αρχικού Date API καθώς και λύνει ορισμένους από τους περιορισμούς που βρίσκονται στο Moment και σε άλλες βιβλιοθήκες. Τι είναι το Temporal; Το Temporal είναι ένα νέο API ώρας και ημερομηνίας που προστίθεται στο πρότυπο ECMAScript, το οποίο ορίζει τη σύγχρονη JavaScript. Από τον Μάρτιο του 20266, έφτασε στο Στάδιο 4 της διαδικασίας TC39 (η επιτροπή που επιβλέπει τις προτάσεις και τις προσθήκες στη γλώσσα JavaScript) και θα συμπεριληφθεί στην επόμενη έκδοση της προδιαγραφής ECMAScript. Έχει ήδη εφαρμοστεί σε πολλά προγράμματα περιήγησης: Chrome 144+ και Firefox 139+, με το Safari να αναμένεται να ακολουθήσει σύντομα. Ένα πολυγέμισμα είναι επίσης διαθέσιμο για μη υποστηριζόμενα προγράμματα περιήγησης και Node.js. Το Temporal API δημιουργεί αντικείμενα που, γενικά, αντιπροσωπεύουν στιγμές στο χρόνο. Αυτές μπορεί να είναι σφραγίδες πλήρους ώρας και ημερομηνίας σε μια δεδομένη ζώνη ώρας ή μπορεί να είναι μια γενική εμφάνιση της ώρας "ρολόι τοίχου" χωρίς πληροφορίες ζώνης ώρας ή ημερομηνίας. Μερικά από τα κύρια χαρακτηριστικά του Temporal περιλαμβάνουν:

Ώρες με ή χωρίς ημερομηνίες. Ένα χρονικό αντικείμενο μπορεί να αντιπροσωπεύει μια συγκεκριμένη ώρα σε μια συγκεκριμένη ημερομηνία ή μια ώρα χωρίς πληροφορίες ημερομηνίας. Μια συγκεκριμένη ημερομηνία, χωρίς ώρα, μπορεί επίσης να αναπαρασταθεί. Υποστήριξη ζώνης ώρας. Τα προσωρινά αντικείμενα γνωρίζουν πλήρως τη ζώνη ώρας και μπορούν να μετατραπούν σε διαφορετικές ζώνες ώρας. Το Moment υποστηρίζει επίσης ζώνες ώρας, αλλά απαιτεί την πρόσθετη βιβλιοθήκη ζώνης ώρας. Immutability. Μόλις δημιουργηθεί ένα Temporal αντικείμενο, δεν μπορεί να αλλάξει. Η αριθμητική ώρα ή οι μετατροπές ζώνης ώρας δεν τροποποιούν το υποκείμενο αντικείμενο. Αντίθετα, δημιουργούν ένα νέο Temporal αντικείμενο. Ευρετηρίαση που βασίζεται σε 1. Μια κοινή πηγή σφαλμάτων με το Date API (καθώς και με το Moment) είναι ότι οι μήνες είναι μηδενικός δείκτης. Αυτό σημαίνει ότι ο Ιανουάριος είναι ο μήνας 0, παρά ο μήνας 1, όπως όλοι καταλαβαίνουμε στην πραγματική ζωή. Το Temporal το διορθώνει χρησιμοποιώντας ευρετηρίαση βάσει 1 — Ο Ιανουάριος είναι ο μήνας 1. Είναι ενσωματωμένο στο πρόγραμμα περιήγησης. Δεδομένου ότι το Temporal είναι ένα API στο ίδιο το πρόγραμμα περιήγησης, δεν προσθέτει τίποτα στο μέγεθος του πακέτου της εφαρμογής σας.

Είναι επίσης σημαντικό να σημειωθεί ότι το Date API δεν θα εξαφανιστεί. Ενώ το Temporal αντικαθιστά αυτό το API, δεν καταργείται ούτε καταργείται. Πολλές εφαρμογές θα έσπασαν εάν τα προγράμματα περιήγησης αφαιρούσαν ξαφνικά το Date API. Ωστόσο, έχετε επίσης υπόψη σας ότι το Moment θεωρείται πλέον ένα έργο παλαιού τύπου σε λειτουργία συντήρησης. Στο υπόλοιπο του άρθρου, θα δούμε μερικές «συνταγές» για τη μετεγκατάσταση κώδικα που βασίζεται στη στιγμή στο νέο Temporal API. Ας ξεκινήσουμε την ανακατασκευή! Δημιουργία αντικειμένων ημερομηνίας και ώρας Προτού μπορέσουμε να χειριστούμε ημερομηνίες και ώρες, πρέπει να δημιουργήσουμε αντικείμενα που τις αντιπροσωπεύουν. Για να δημιουργήσετε ένα αντικείμενο Moment που αντιπροσωπεύει την τρέχουσα ημερομηνία και ώρα, χρησιμοποιήστε τη συνάρτηση στιγμής. const now = moment(); console.log(τώρα); // Στιγμή<2026-02-18T21:26:29-05:00>

Αυτό το αντικείμενο μπορεί τώρα να μορφοποιηθεί ή να τροποποιηθεί όπως απαιτείται.

// μετατροπή σε UTC //προειδοποίηση: Αυτό μεταλλάσσεται το αντικείμενο Moment και το θέτει σε λειτουργία UTC! console.log(now.utc()); // Στιγμή<2026-02-19T02:26:29Z>

// εκτυπώστε μια μορφοποιημένη συμβολοσειρά - σημειώστε ότι χρησιμοποιεί την ώρα UTC τώρα console.log(now.format('ΜΜ/ΗΗ/ΕΕΕΕ ωω:λλ:δδ α')); // 19/02/2026 02:27:07 π.μ

Το βασικό πράγμα που πρέπει να θυμάστε για το Moment είναι ότι ένα αντικείμενο Moment περιλαμβάνει πάντα πληροφορίες σχετικά με την ώρα και την ημερομηνία. Εάν χρειάζεται να εργαστείτε μόνο με πληροφορίες ώρας, αυτό είναι συνήθως εντάξει, αλλά μπορεί να προκαλέσει απροσδόκητη συμπεριφορά σε καταστάσεις όπως η θερινή ώρα ή τα δίσεκτα έτη, όπου η ημερομηνία μπορεί να επηρεάσει τους υπολογισμούς της ώρας. Το Temporal είναι πιο ευέλικτο. Μπορείτε να δημιουργήσετε ένα αντικείμενο που αντιπροσωπεύει την τρέχουσα ημερομηνία και ώρα δημιουργώντας ένα αντικείμενο Temporal.Instant. Αυτό αντιπροσωπεύει ένα χρονικό σημείο που ορίζεται από τον χρόνο από την «εποχή» (μεσάνυχτα UTC της 1ης Ιανουαρίου 1970). Το Temporal μπορεί να αναφέρει αυτή τη στιγμή έγκαιρα με ακρίβεια σε επίπεδο νανοδευτερόλεπτου. const now = Temporal.Now.instant();

// δείτε ακατέργαστα νανοδευτερόλεπτα από την εποχή console.log(now.epochNanoseconds); // 1771466342612000000n

// μορφή για UTC console.log(now.toString()); // 2026-02-19T01:55:27.844Z

// μορφή για μια συγκεκριμένη ζώνη ώρας console.log(now.toString({ timeZone: 'America/New_York' })); // 2026-02-18T20:56:57.905-05:00

Τα Temporal.Instant αντικείμενα μπορούν επίσης να δημιουργηθούν για μια συγκεκριμένη ώρα και ημερομηνία χρησιμοποιώντας τη μέθοδο από στατική.

const myInstant = Temporal.Instant.from('2026-02-18T21:10:00-05:00');

// Μορφοποίηση της στιγμής στην τοπική ζώνη ώρας. Σημειώστε ότι αυτό ελέγχει μόνο // η μορφοποίηση - δεν αλλάζει το αντικείμενο όπως το moment.utc. console.log(myInstant.toString({ timeZone: 'America/New_York' })); // 2026-02-18T21:10:00-05:00

Μπορείτε επίσης να δημιουργήσετε άλλους τύπους προσωρινών αντικειμένων, όπως:

Temporal.PlainDate: Μια ημερομηνία χωρίς πληροφορίες ώρας. Temporal.PlainTime: Μια ώρα χωρίς πληροφορίες ημερομηνίας. Temporal.ZonedDateTime: Ημερομηνία και ώρα σε μια συγκεκριμένη ζώνη ώρας.

Καθένα από αυτά έχει μια μέθοδο from που μπορεί να κληθεί με ένα αντικείμενο που καθορίζει την ημερομηνία και/ή την ώρα ή μια συμβολοσειρά ημερομηνίας για ανάλυση. // Μόνο ένα ραντεβού const today = Temporal.PlainDate.from({ έτος: 2026, μήνας: 2, // σημειώστε ότι χρησιμοποιούμε 2 για τον Φεβρουάριο ημέρα: 18 }); console.log(today.toString()); // 2026-02-18

// Μόνο μια στιγμή const lunchTime = Temporal.PlainTime.from({ ώρα: 12 }); console.log(lunchTime.toString()); // 12:00:00

// Μια ημερομηνία και ώρα στην ανατολική ζώνη ώρας των ΗΠΑ const dueAt = Temporal.ZonedDateTime.from({ Ζώνη ώρας: 'Αμερική/Νέα Υόρκη', έτος: 2026, μήνας: 3, ημέρα: 1, ώρα: 12, λεπτό: 0, δεύτερο: 0 }); console.log(dueAt.toString()); // 2026-03-01T12:00:00-05:00[America/New_York]

Ανάλυση Καλύψαμε τη δημιουργία πληροφοριών ημερομηνίας και ώρας μέσω προγραμματισμού. Τώρα ας δούμε την ανάλυση. Η ανάλυση είναι ένας τομέας όπου το Moment είναι πιο ευέλικτο από το ενσωματωμένο Temporal API. Μπορείτε να αναλύσετε μια συμβολοσειρά ημερομηνίας περνώντας τη στη συνάρτηση στιγμής. Με ένα μόνο όρισμα, το Moment αναμένει μια συμβολοσειρά ημερομηνίας ISO, αλλά μπορείτε να χρησιμοποιήσετε εναλλακτικές μορφές εάν παρέχετε ένα δεύτερο όρισμα που καθορίζει τη μορφή ημερομηνίας που χρησιμοποιείται.

const isoDate = moment('2026-02-21T09:00:00'); const formattedDate = moment('2/21/26 9:00:00', 'M/D/YY h:mm:ss');

console.log(isoDate); // Στιγμή<2026-02-21T09:00:00-05:00>

console.log(formattedDate); // Στιγμή<2026-02-21T09:00:00-05:00>

Σε παλαιότερες εκδόσεις, το Moment θα έκανε την καλύτερη εικασία για να αναλύσει οποιαδήποτε αυθαίρετα μορφοποιημένη συμβολοσειρά ημερομηνίας. Αυτό θα μπορούσε να οδηγήσει σε απρόβλεπτα αποτελέσματα. Για παράδειγμα, η 02-03-2026 είναι 2 Φεβρουαρίου ή 3 Μαρτίου; Για αυτόν τον λόγο, οι νεότερες εκδόσεις του Moment εμφανίζουν μια εμφανή προειδοποίηση κατάργησης, εάν καλείται χωρίς συμβολοσειρά ημερομηνίας με μορφοποίηση ISO (εκτός εάν δίνεται και το δεύτερο όρισμα με την επιθυμητή μορφή). Το Temporal θα αναλύσει μόνο μια ειδικά διαμορφωμένη συμβολοσειρά ημερομηνίας. Η συμβολοσειρά πρέπει να είναι συμβατή με τη μορφή ISO 8601 ή με την επέκτασή της, RFC 9557. Εάν μια μη συμβατή συμβολοσειρά ημερομηνίας μεταβιβαστεί στη μέθοδο από, το Temporal θα εμφανίσει ένα Σφάλμα εύρους.

// Χρησιμοποιώντας μια συμβολοσειρά ημερομηνίας RFC 9557 const myDate = Temporal.Instant.from('2026-02-21T09:00:00-05:00[America/New_York]'); console.log(myDate.toString({ timeZone: 'America/New_York' })); // 2026-02-21T09:00:00-05:00

// Χρήση συμβολοσειράς άγνωστης ημερομηνίας const otherDate = Temporal.Instant.from('2/21/26 9:00:00'); // RangeError: Χρονικό σφάλμα: Μη έγκυρος χαρακτήρας κατά την ανάλυση της τιμής του έτους.

Οι ακριβείς απαιτήσεις της συμβολοσειράς ημερομηνίας εξαρτώνται από το είδος του Temporal αντικειμένου που δημιουργείτε. Στο παραπάνω παράδειγμα, το Temporal.Instant απαιτεί πλήρες ISO8601 ή RFC 9557 συμβολοσειρά ημερομηνίας που καθορίζει την ημερομηνία και την ώρα με μετατόπιση ζώνης ώρας, αλλά μπορείτε επίσης να δημιουργήσετε αντικείμενα PlainDate ή PlainTime χρησιμοποιώντας μόνο ένα υποσύνολο της μορφής ημερομηνίας. const myDate = Temporal.PlainDate.from('2026-02-21'); console.log(myDate.toString()); // 2026-02-21

const myTime = Temporal.PlainTime.from('09:00:00'); console.log(myTime.toString()); // 09:00:00

Λάβετε υπόψη ότι αυτές οι συμβολοσειρές πρέπει να συμμορφώνονται με την αναμενόμενη μορφή, διαφορετικά θα προκύψει σφάλμα.

// Χρήση μη συμβατών συμβολοσειρών χρόνου. Όλα αυτά θα ρίξουν ένα RangeError. Temporal.PlainTime.from('9:00'); Temporal.PlainTime.from('9:00:00 AM');

Επαγγελματική συμβουλή: Χειρισμός συμβολοσειρών που δεν είναι ISO Επειδή το Temporal δίνει προτεραιότητα στην αξιοπιστία, δεν θα προσπαθήσει να μαντέψει τη μορφή μιας συμβολοσειράς όπως η 02-01-2026. Εάν η πηγή δεδομένων σας χρησιμοποιεί τέτοιες συμβολοσειρές, θα χρειαστεί να κάνετε κάποιο χειρισμό συμβολοσειράς για να αναδιατάξετε τις τιμές σε μια συμβολοσειρά ISO όπως το 2026-02-01 πριν επιχειρήσετε να τη χρησιμοποιήσετε με το Temporal.

Μορφοποίηση Μόλις έχετε ένα αντικείμενο Moment ή Temporal, πιθανότατα θα θέλετε να το μετατρέψετε σε μια μορφοποιημένη συμβολοσειρά κάποια στιγμή. Αυτή είναι μια περίπτωση όπου το Moment είναι λίγο πιο λακωνικό. Καλείτε τη μέθοδο μορφοποίησης του αντικειμένου με μια σειρά από διακριτικά που περιγράφουν την επιθυμητή μορφή ημερομηνίας. const date = moment();

console.log(date.format('MM/DD/YYYY')); // 22/02/2026

console.log(date.format('MMMM Do YYYY, h:mm:ss a')); // 22 Φεβρουαρίου 2026, 8:18:30 μ.μ

Από την άλλη πλευρά, το Temporal απαιτεί από εσάς να είστε λίγο πιο αναλυτικοί. Τα προσωρινά αντικείμενα, όπως το Instant, έχουν μια μέθοδο toLocaleString που δέχεται διάφορες επιλογές μορφοποίησης που καθορίζονται ως ιδιότητες ενός αντικειμένου.

const date = Temporal.Now.instant();

// χωρίς ορίσματα, θα λάβουμε την προεπιλεγμένη μορφή για την τρέχουσα τοπική ρύθμιση console.log(date.toLocaleString()); // 22/2/2026, 8:23:36 μ.μ. (υποθέτοντας τοπική γλώσσα en-US)

// περάστε τις επιλογές μορφοποίησης για τη δημιουργία μιας συμβολοσειράς προσαρμοσμένης μορφής console.log(date.toLocaleString('en-US', { μήνας: 'μακρός', ημέρα: «αριθμητικό», έτος: «αριθμητικό», ώρα: '2-ψήφιο', λεπτό: "2-ψήφιο" })); // 22 Φεβρουαρίου 2026 στις 8:23 μ.μ

// περάστε μόνο τα πεδία που θέλετε στη συμβολοσειρά μορφοποίησης console.log(date.toLocaleString('en-US', { μήνας: «σύντομος», ημέρα: "αριθμητικό" })); // 22 Φεβρουαρίου

Η προσωρινή μορφοποίηση ημερομηνίας χρησιμοποιεί στην πραγματικότητα το API Intl.DateTimeFormat (το οποίο είναι ήδη άμεσα διαθέσιμο στα σύγχρονα προγράμματα περιήγησης) κάτω από την κουκούλα. Αυτό σημαίνει ότι μπορείτε να δημιουργήσετε ένα επαναχρησιμοποιήσιμο αντικείμενο DateTimeFormat με τις προσαρμοσμένες επιλογές μορφοποίησης και, στη συνέχεια, να μεταβιβάσετε τα Temporal αντικείμενα στη μέθοδο μορφοποίησής του. Εξαιτίας αυτού, δεν υποστηρίζει προσαρμοσμένες μορφές ημερομηνίας όπως το Moment. Εάν χρειάζεστε κάτι όπως το '1ο τρίμηνο 2026' ή άλλη εξειδικευμένη μορφοποίηση, μπορεί να χρειαστείτε κάποιο προσαρμοσμένο κωδικό μορφοποίησης ημερομηνίας ή πρόσβαση σε μια βιβλιοθήκη τρίτου μέρους. const formatter = new Intl.DateTimeFormat('en-US', { μήνας: '2-ψήφιο', ημέρα: '2-ψήφιο', έτος: «αριθμητικό» });

const date = Temporal.Now.instant(); console.log(formatter.format(ημερομηνία)); // 22/02/2026

Τα διακριτικά μορφοποίησης του Moment είναι πιο απλά στην εγγραφή, αλλά δεν είναι φιλικά προς τις τοπικές ρυθμίσεις. Η μορφή περιλαμβάνει συμβολοσειρές "σκληρού κώδικα" όπως σειρά μήνα/ημέρα. Το πλεονέκτημα της χρήσης ενός αντικειμένου διαμόρφωσης, όπως κάνει το Temporal, είναι ότι θα προσαρμοστεί αυτόματα σε οποιαδήποτε δεδομένη τοποθεσία και θα χρησιμοποιήσει τη σωστή μορφή. const date = Temporal.Now.instant();

const formatOptions = { μήνας: «αριθμητικός», ημέρα: «αριθμητικό», έτος: «αριθμητικό» };

console.log(date.toLocaleString('en-US', formatOptions)); // 22/2/2026

console.log(date.toLocaleString('en-GB', formatOptions)); // 22/02/2026

Υπολογισμοί ημερομηνίας Σε πολλές εφαρμογές, θα πρέπει να καταλήξετε να εκτελέσετε ορισμένους υπολογισμούς σε μια ημερομηνία. Μπορεί να θέλετε να προσθέσετε ή να αφαιρέσετε μονάδες χρόνου (ημέρες, ώρες, δευτερόλεπτα, κ.λπ.). Για παράδειγμα, εάν έχετε την τρέχουσα ημερομηνία, μπορεί να θέλετε να δείξετε στον χρήστη την ημερομηνία σε 1 εβδομάδα από τώρα. Τα αντικείμενα στιγμής έχουν μεθόδους όπως πρόσθεση και αφαίρεση που εκτελούν αυτές τις πράξεις. Αυτές οι συναρτήσεις παίρνουν μια τιμή και μια μονάδα, για παράδειγμα: add(7, 'days'). Μια πολύ σημαντική διαφορά μεταξύ του Moment και του Temporal, ωστόσο, είναι ότι κατά την εκτέλεση αυτών των υπολογισμών ημερομηνίας, το υποκείμενο αντικείμενο τροποποιείται και η αρχική του τιμή χάνεται. const now = moment();

console.log(τώρα); // Στιγμή<2026-02-24T20:08:36-05:00>

const nextWeek = now.add(7, 'days'); console.log(nextWeek); // Στιγμή<2026-03-03T20:08:36-05:00>

// Gotcha - το αρχικό αντικείμενο μεταλλάχθηκε console.log(τώρα); // Στιγμή<2026-03-03T20:08:36-05:00>

Για να αποφύγετε την απώλεια της αρχικής ημερομηνίας, μπορείτε να καλέσετε το clone στο αντικείμενο Moment για να δημιουργήσετε ένα αντίγραφο. const τώρα= moment(); const nextWeek = now.clone().add(7, 'days');

console.log(τώρα); // Στιγμή<2026-02-24T20:12:55-05:00>

console.log(nextWeek); // Στιγμή<2026-03-03T20:12:55-05:00>

Από την άλλη πλευρά, τα χρονικά αντικείμενα είναι αμετάβλητα. Μόλις δημιουργήσετε ένα αντικείμενο όπως Instant, PlainDate και ούτω καθεξής, η τιμή αυτού του αντικειμένου δεν θα αλλάξει ποτέ. Τα χρονικά αντικείμενα έχουν επίσης μεθόδους πρόσθεσης και αφαίρεσης. Το Temporal είναι λίγο επιλεκτικό σχετικά με το ποιες μονάδες χρόνου μπορούν να προστεθούν σε ποιους τύπους αντικειμένων. Για παράδειγμα, δεν μπορείτε να προσθέσετε ημέρες σε ένα Instant:

const now = Temporal.Now.instant(); const nextWeek = now.add({ ημέρες: 7 }); // Εύρος Σφάλμα: Χρονικό σφάλμα: Η μεγαλύτερη μονάδα δεν μπορεί να είναι μονάδα ημερομηνίας

Αυτό συμβαίνει επειδή τα Instant αντικείμενα αντιπροσωπεύουν μια συγκεκριμένη χρονική στιγμή στο UTC και είναι ημερολογιακά αγνωστικά. Επειδή η διάρκεια μιας ημέρας μπορεί να αλλάξει με βάση τους κανόνες της ζώνης ώρας, όπως η θερινή ώρα, αυτός ο υπολογισμός δεν είναι διαθέσιμος στο Instant. Μπορείτε, ωστόσο, να εκτελέσετε αυτήν τη λειτουργία σε άλλους τύπους αντικειμένων, όπως ένα PlainDateTime: const now = Temporal.Now.plainDateTimeISO(); console.log(now.toLocaleString()); // 24/2/2026, 8:23:59 μ.μ

const nextWeek = now.add({ ημέρες: 7 });

// Σημειώστε ότι το αρχικό PlainDateTime παραμένει αμετάβλητο console.log(now.toLocaleString()); // 24/2/2026, 8:23:59 μ.μ

console.log(nextWeek.toLocaleString()); // 3/3/2026, 8:23:59 μ.μ

Μπορείτε επίσης να υπολογίσετε πόσος χρόνος είναι μεταξύ δύο αντικειμένων Στιγμής ή Χρονικής. Με τη λειτουργία Moment's diff, πρέπει να παρέχετε μια μονάδα για ευαισθησία, διαφορετικά θα επιστρέψει τη διαφορά σε χιλιοστά του δευτερολέπτου. const date1 = moment('2026-02-21T09:00:00'); const date2 = moment('2026-02-22T10:30:00');

console.log(date2.diff(date1)); // 91800000

console.log(date2.diff(date1, 'days')); // 1

Για να το κάνετε αυτό με ένα Temporal αντικείμενο, μπορείτε να περάσετε ένα άλλο Temporal αντικείμενο στις μεθόδους του μέχρι ή after. Αυτό επιστρέφει ένα αντικείμενο Temporal.Duration που περιέχει πληροφορίες σχετικά με τη διαφορά ώρας. Το αντικείμενο Duration έχει ιδιότητες για κάθε στοιχείο της διαφοράς και μπορεί επίσης να δημιουργήσει μια συμβολοσειρά διάρκειας ISO 8601 που αντιπροσωπεύει τη διαφορά ώρας.

const date1 = Temporal.PlainDateTime.from('2026-02-21T09:00:00'); const date2 = Temporal.PlainDateTime.from('2026-02-22T10:30:00');

// largeUnit καθορίζει τη μεγαλύτερη μονάδα χρόνου που πρέπει να αναπαρασταθεί // στον υπολογισμό της διάρκειας const diff = date2.since(date1, { largeUnit: 'day' });

console.log(diff.days); // 1

console.log(diff.hours); // 1

console.log(diff.minutes); // 30

console.log(diff.toString()); // P1DT1H30M // (Συμβολοσειρά διάρκειας ISO 8601: 1 ημέρα, 1 ώρα, 30 λεπτά)

Σύγκριση ημερομηνιών και ωρών Το Moment και το Temporal σάς επιτρέπουν να συγκρίνετε ημερομηνίες και ώρες για να προσδιορίσετε ποια προηγείται του άλλου, αλλά ακολουθήστε διαφορετικές προσεγγίσεις με το API. Το Moment παρέχει μεθόδους όπως isBefore, isAfter και isSame για σύγκριση δύο αντικειμένων Moment. const date1 = moment('2026-02-21T09:00:00'); const date2 = moment('2026-02-22T10:30:00');

console.log(date1.isBefore(date2)); // αληθές

Το Temporal χρησιμοποιεί μια μέθοδο στατικής σύγκρισης για να πραγματοποιήσει σύγκριση μεταξύ δύο αντικειμένων του ίδιου τύπου. Επιστρέφει -1 εάν η πρώτη ημερομηνία είναι πριν από τη δεύτερη, 0 εάν είναι ίσες ή 1 εάν η πρώτη ημερομηνία έρχεται μετά τη δεύτερη. Το ακόλουθο παράδειγμα δείχνει πώς να συγκρίνετε δύο αντικείμενα PlainDate. Και τα δύο ορίσματα στο Temporal.PlainDate.compare πρέπει να είναι αντικείμενα PlainDate.

const date1 = Temporal.PlainDate.from({ έτος: 2026, μήνας: 2, ημέρα: 24 }); const date2 = Temporal.PlainDate.from({ έτος: 2026, μήνας: 3, ημέρα: 24 });

// Η ημερομηνία1 προηγείται της ημερομηνίας2, άρα -1 console.log(Temporal.PlainDate.compare(date1, date2));

// Σφάλμα αν προσπαθήσουμε να συγκρίνουμε δύο αντικείμενα διαφορετικών τύπων console.log(Temporal.PlainDate.compare(date1, Temporal.Now.instant())); // TypeError: Χρονικό σφάλμα: Παρέχονται μη έγκυρα πεδία PlainDate.

Συγκεκριμένα, αυτό καθιστά εύκολη τη χρονολογική ταξινόμηση μιας σειράς χρονικών αντικειμένων. // Ένας πίνακας αντικειμένων Temporal.PlainDate ημερομηνίες καταβολής = [ ... ];

// χρησιμοποιήστε το Temporal.PlainDate.compare ως συνάρτηση σύγκρισης dates.sort(Temporal.PlainDate.compare);

Μετατροπές ζώνης ώρας Η βασική βιβλιοθήκη Moment δεν υποστηρίζει μετατροπές ζώνης ώρας. Εάν χρειάζεστε αυτήν τη λειτουργία, πρέπει επίσης να εγκαταστήσετε το πακέτο ζώνης ώρας στιγμής. Αυτό το πακέτο δεν μπορεί να κουνηθεί από δέντρα και επομένως μπορεί να προσθέσει σημαντικά το μέγεθος του πακέτου σας. Αφού εγκαταστήσετε τη ζώνη ώρας στιγμής, μπορείτε να μετατρέψετε αντικείμενα Moment σε διαφορετικές ζώνες ώρας με τη μέθοδο tz. Όπως και με άλλες λειτουργίες Moment, αυτό μεταλλάσσει το υποκείμενοαντικείμενο. // Υποθέτοντας ανατολική ώρα ΗΠΑ const now = moment(); console.log(τώρα); // Στιγμή<2026-02-28T20:08:20-05:00>

// Μετατροπή σε ώρα Ειρηνικού. // Η αρχική ανατολική ώρα χάνεται. now.tz('America/Los_Angeles'); console.log(τώρα); // Στιγμή<2026-02-28T17:08:20-08:00>

Η λειτουργία ζώνης ώρας είναι ενσωματωμένη στο Temporal API όταν χρησιμοποιείται ένα αντικείμενο Temporal.ZonedDateTime. Αυτά τα αντικείμενα περιλαμβάνουν μια μέθοδο withTimeZone που επιστρέφει μια νέα ZonedDateTime που αντιπροσωπεύει την ίδια χρονική στιγμή, αλλά στην καθορισμένη ζώνη ώρας. // Και πάλι, υποθέτοντας ώρα Ανατολικής Αμερικής const now = Temporal.Now.zonedDateTimeISO(); console.log(now.toLocaleString()); // 28/2/2026, 8:12:02 μ.μ. EST

// Μετατροπή σε ώρα Ειρηνικού const nowPacific = now.withTimeZone('America/Los_Angeles'); console.log(nowPacific.toLocaleString()); // 28/2/2026, 5:12:02 μ.μ. PST

// Το αρχικό αντικείμενο παραμένει αμετάβλητο console.log(now.toLocaleString()); // 28/2/2026, 8:12:02 μ.μ. EST

Σημείωση: Οι μορφοποιημένες τιμές που επιστρέφονται από το toLocaleString, όπως υποδηλώνει το όνομα, εξαρτώνται από τις τοπικές ρυθμίσεις. Το δείγμα κώδικα αναπτύχθηκε στην τοπική ρύθμιση en-US, επομένως η μορφή έχει ως εξής: 28/2/2026, 5:12:02 μ.μ. PST. Σε άλλη τοποθεσία, αυτό μπορεί να είναι διαφορετικό. Για παράδειγμα, στην τοπική ρύθμιση en-GB, θα λάβετε κάτι σαν 28/2/2026, 17:12:02 GMT-8. A Real-world Refactoring Ας υποθέσουμε ότι χτίζουμε μια εφαρμογή για τον προγραμματισμό συμβάντων σε ζώνες ώρας. Μέρος αυτής της εφαρμογής είναι μια συνάρτηση, το getEventTimes, η οποία παίρνει μια συμβολοσειρά ISO 8601 που αντιπροσωπεύει την ώρα και την ημερομηνία του συμβάντος, μια τοπική ζώνη ώρας και μια ζώνη ώρας στόχου. Η συνάρτηση δημιουργεί μορφοποιημένες συμβολοσειρές ώρας και ημερομηνίας για το συμβάν και στις δύο ζώνες ώρας. Εάν δοθεί στη συνάρτηση μια συμβολοσειρά εισόδου που δεν είναι έγκυρη συμβολοσειρά ώρας/ημερομηνίας, θα εμφανίσει σφάλμα. Εδώ είναι η αρχική υλοποίηση, χρησιμοποιώντας το Moment (απαιτείται επίσης η χρήση του πακέτου ζώνης ώρας στιγμής).

στιγμή εισαγωγής από «στιγμή-ζώνη ώρας».

συνάρτηση getEventTimes(inputString, userTimeZone, targetTimeZone) { const timeFormat = 'MMM D, YYYY, h:mm:ss a z';

// 1. Δημιουργήστε την αρχική στιγμή στη ζώνη ώρας του χρήστη const eventTime = moment.tz( inputString, moment.ISO_8601, // Αναμένετε μια συμβολοσειρά ISO 8601 true, // Αυστηρή ανάλυση userTimeZone )

// Πραγματοποιήστε ένα σφάλμα εάν η συμβολοσειρά εισόδου δεν αντιπροσώπευε μια έγκυρη ημερομηνία if (!eventTime.isValid()) { ρίχνει νέο Σφάλμα('Μη έγκυρη ημερομηνία/ώρα εισαγωγής'); }

// 2. Υπολογίστε τον χρόνο-στόχο // ΚΡΙΣΙΜΟ: Πρέπει να κλωνοποιήσουμε, διαφορετικά το 'eventTime' θα αλλάξει για πάντα! const targetTime = eventTime.clone().tz(targetTimeZone);

επιστροφή { τοπικό: eventTime.format(timeFormat), target: targetTime.format(timeFormat), }; }

χρονοδιάγραμμα const = getEventTimes( '2026-03-05T15:00-05:00', 'America/New_York', «Ευρώπη/Λονδίνο», )

console.log(schedule.local); // 5 Μαρτίου 2026, 3:00:00 μ.μ. EST

console.log(schedule.target); // 5 Μαρτίου 2026, 8:00:00 μ.μ. GMT

Σε αυτό το παράδειγμα, χρησιμοποιούμε μια αναμενόμενη μορφή ημερομηνίας ISO 8601, η οποία είναι χρήσιμη ενσωματωμένη στο Moment. Χρησιμοποιούμε επίσης αυστηρή ανάλυση, που σημαίνει ότι το Moment δεν θα προσπαθήσει να μαντέψει με μια συμβολοσειρά ημερομηνίας που δεν ταιριάζει με τη μορφή. Εάν διαβιβαστεί μια συμβολοσειρά ημερομηνίας που δεν είναι ISO, θα οδηγήσει σε ένα μη έγκυρο αντικείμενο ημερομηνίας και θα ρίξουμε ένα σφάλμα. Η εφαρμογή Temporal μοιάζει παρόμοια, αλλά έχει μερικές βασικές διαφορές.

συνάρτηση getEventTimes(inputString, userTimeZone, targetTimeZone) { // 1. Αναλύστε την είσοδο απευθείας σε ένα Instant και, στη συνέχεια, δημιουργήστε // a ZonedDateTime στη ζώνη του χρήστη. const instant = Temporal.Instant.from(inputString); const eventTime = instant.toZonedDateTimeISO(userTimeZone);

// 2. Μετατροπή στη ζώνη προορισμού // Αυτό επιστρέφει αυτόματα ένα ΝΕΟ αντικείμενο. Το 'eventTime' είναι ασφαλές. const targetTime = eventTime.withTimeZone(targetTimeZone);

// 3. Μορφοποίηση με χρήση Intl (ενσωματωμένο) επιλογές const = { έτος: «αριθμητικό», μήνας: «σύντομος», ημέρα: «αριθμητικό», ώρα: «αριθμητική», λεπτό: '2-ψήφιο', δεύτερο: «2-ψήφιο», timeZoneName: "σύντομη" };

επιστροφή { local: eventTime.toLocaleString(navigator.language, επιλογές), target: targetTime.toLocaleString(navigator.language, επιλογές) }; }

χρονοδιάγραμμα const = getEventTimes( '2026-03-05T15:00-05:00', 'America/New_York', «Ευρώπη/Λονδίνο», )

console.log(schedule.local); // 5 Μαρτίου 2026, 3:00:00 μ.μ. EST

console.log(schedule.target); // 5 Μαρτίου 2026, 8:00:00 μ.μ. GMT

Με το Moment, πρέπει να καθορίσουμε ρητά μια συμβολοσειρά μορφής για τις συμβολοσειρές ημερομηνίας που προκύπτουν. Ανεξάρτητα από την τοποθεσία ή τις τοπικές ρυθμίσεις του χρήστη, οι ώρες συμβάντων θα διαμορφώνονται πάντα ως 5 Μαρτίου 2026, 3:00:00μ.μ. EST. Επίσης, δεν χρειάζεται να κάνουμε ρητά εξαίρεση. Εάν μια μη έγκυρη συμβολοσειρά μεταβιβαστεί στο Temporal.Instant.from, η Temporal θα δημιουργήσει την εξαίρεση για εμάς. Ένα πράγμα που πρέπει να σημειωθεί είναι ότι ακόμη και με αυστηρή ανάλυση, η έκδοση Moment είναι ακόμα πιο επιεικής. Το Temporal απαιτεί τη μετατόπιση ζώνης ώρας στο τέλος της συμβολοσειράς. Θα πρέπει επίσης να σημειώσετε ότι εφόσον χρησιμοποιούμε το navigator.language, αυτός ο κώδικας θα εκτελείται μόνο σε περιβάλλον προγράμματος περιήγησης, καθώς το navigator δεν έχει οριστεί σε περιβάλλον Node.js. Η εφαρμογή Temporal χρησιμοποιεί τις τρέχουσες τοπικές ρυθμίσεις του προγράμματος περιήγησης (navigator.language), επομένως ο χρήστης θα λαμβάνει αυτόματα τις ώρες συμβάντων μορφοποιημένες στη μορφή τοπικής ώρας. Στην τοπική γλώσσα en-US, αυτή είναι 5 Μαρτίου 2026, 3:00:00 μ.μ. EST. Ωστόσο, εάν ο χρήστης βρίσκεται στο Λονδίνο, για παράδειγμα, οι ώρες εκδήλωσης θα διαμορφωθούν ως 5 Μαρτίου 2026, 15:00:00 GMT-5. Περίληψη

Δράση Στιγμή.js Χρονική Τρέχουσα ώρα στιγμή () Temporal.Now.zonedDateTimeISO() Ανάλυση ISO στιγμή (str) Temporal.Instant.from(str) Προσθέστε χρόνο .add(7, 'ημέρες') (μετάλλαξη) .add({ ημέρες: 7 }) (νέο αντικείμενο) Διαφορά .diff(άλλο, "ώρες") .από(άλλο).ώρες Ζώνη ώρας .tz('Ζώνη/Όνομα') .withTimeZone('Ζώνη/Όνομα')

Με την πρώτη ματιά, η διαφορά μπορεί να είναι ελαφρώς διαφορετική (και στην περίπτωση της Temporal, μερικές φορές πιο αναλυτική και πιο αυστηρή) σύνταξη, αλλά υπάρχουν πολλά βασικά πλεονεκτήματα στη χρήση του Temporal έναντι του Moment.js:

Το να είσαι πιο σαφής σημαίνει λιγότερες εκπλήξεις και ακούσια σφάλματα. Η στιγμή μπορεί να φαίνεται πιο επιεική, αλλά περιλαμβάνει «εικασίες», που μερικές φορές μπορεί να οδηγήσει σε λανθασμένες ημερομηνίες. Αν δώσετε στο Temporal κάτι μη έγκυρο, βγάζει σφάλμα. Εάν εκτελείται ο κωδικός, γνωρίζετε ότι έχετε έγκυρη ημερομηνία. Το Moment μπορεί να προσθέσει σημαντικό μέγεθος στο πακέτο της εφαρμογής, ιδιαίτερα αν χρησιμοποιείτε το πακέτο της ζώνης ώρας στιγμής. Το Temporal δεν προσθέτει τίποτα (αφού αποσταλεί στα προγράμματα περιήγησης-στόχου σας). Το Immutability σάς δίνει τη σιγουριά ότι ποτέ δεν θα χάσετε ή θα αντικαταστήσετε δεδομένα κατά την εκτέλεση μετατροπών και λειτουργιών ημερομηνίας. Διαφορετικές αναπαραστάσεις χρόνου (Instant, PlainDateTime, ZonedDateTime) ανάλογα με τις απαιτήσεις σας, όπου το Moment είναι πάντα ένα περιτύλιγμα γύρω από μια χρονική σήμανση UTC. Το Temporal χρησιμοποιεί τα Intl API για μορφοποίηση ημερομηνίας, πράγμα που σημαίνει ότι μπορείτε να έχετε μορφοποίηση με επίγνωση των τοπικών ρυθμίσεων χωρίς να χρειάζεται να προσδιορίσετε ρητά διακριτικά.

Σημειώσεις για το Polyfill Όπως αναφέρθηκε προηγουμένως, υπάρχει διαθέσιμο ένα Temporal polyfill, το οποίο διανέμεται ως πακέτο npm με το όνομα @js-temporal/polyfill. Εάν θέλετε να χρησιμοποιήσετε το Temporal σήμερα, θα χρειαστείτε αυτό το πολυγέμισμα για να υποστηρίξετε προγράμματα περιήγησης όπως το Safari που δεν έχουν αποστείλει ακόμα το API. Τα κακά νέα με αυτό είναι ότι θα προσθέσει στο μέγεθος του πακέτου σας. Τα καλά νέα είναι ότι εξακολουθεί να προσθέτει σημαντικά λιγότερα από τη στιγμή ή τη ζώνη ώρας. Ακολουθεί μια σύγκριση των μεγεθών του πακέτου όπως αναφέρεται από το Bundlephobia.com, έναν ιστότοπο που παρουσιάζει πληροφορίες για τα μεγέθη πακέτων npm (κάντε κλικ στο όνομα κάθε πακέτου για να δείτε την ανάλυση Bundlephobia):

Πακέτο Ελαχιστοποιήθηκε Ελαχιστοποιημένο & gzip @js-temporal/polyfill 154,1 kB 44,1 kB στιγμή 294,4 kB 75,4 kB ζώνη ώρας 1 MB 114,2 kB

Το polyfill είχε επίσης ιστορικά κάποια προβλήματα απόδοσης σχετικά με τη χρήση της μνήμης και τη στιγμή της γραφής, θεωρείται ότι βρίσκεται σε κατάσταση άλφα. Εξαιτίας αυτού, μπορεί να μην θέλετε να το χρησιμοποιήσετε στην παραγωγή μέχρι να φτάσει σε μια πιο ώριμη κατάσταση. Τα άλλα καλά νέα είναι ότι ελπίζουμε ότι το polyfill δεν θα χρειαστεί πολύ περισσότερο (εκτός και αν χρειαστεί να υποστηρίξετε παλαιότερα προγράμματα περιήγησης, φυσικά). Κατά τη στιγμή της γραφής, το Temporal έχει αποσταλεί σε Chrome, Edge και Firefox. Δεν είναι ακόμη έτοιμο στο Safari, αν και φαίνεται να είναι διαθέσιμο με σημαία χρόνου εκτέλεσης στην πιο πρόσφατη προεπισκόπηση τεχνολογίας.

You May Also Like

Enjoyed This Article?

Get weekly tips on growing your audience and monetizing your content — straight to your inbox.

No spam. Join 138,000+ creators. Unsubscribe anytime.

Create Your Free Bio Page

Join 138,000+ creators on Seemless.

Get Started Free