← Όλα τα εργαλεία

Μετατροπέας Unix Timestamp

Μετατρέψτε Unix timestamps σε ημερομηνίες και αντίστροφα ακαριαία στον browser σας. Μάθετε το epoch time, δευτερόλεπτα και χιλιοστά, παγίδες UTC και το πρόβλημα του 2038.

Unix Timestamps χωρίς τον πονοκέφαλο

Ρωτήστε τρεις προγραμματιστές τι ώρα είναι και μπορεί να πάρετε τρεις απαντήσεις, ανάλογα με το πού κάθονται. Ρωτήστε ένα Unix timestamp και παίρνετε ακριβώς έναν αριθμό, τον ίδιο για όλους στον πλανήτη. Αυτός ο μοναδικός ακέραιος είναι ο λόγος που ο χρόνος epoch στηρίζει σιωπηλά σχεδόν κάθε αρχείο log, γραμμή βάσης δεδομένων, και απόκριση API που θα αγγίξετε ποτέ. Αυτή η σελίδα εξηγεί τι σημαίνει αυτός ο αριθμός, πώς να τον διαβάσετε και προς τις δύο κατευθύνσεις, και πού τείνει να δαγκώνει τον κόσμο.

Φωτεινό ρολόι που διαλύεται σε μια ροή φωτεινών ψηφίων, αναπαριστώντας τον χρόνο Unix epoch
Ο χρόνος epoch είναι ένας μοναδικός μετρητής που κτυπάει προς τα εμπρός από το 1970.

Τι είναι πραγματικά ο χρόνος Unix

Ένα Unix timestamp είναι ο αριθμός των δευτερολέπτων που έχουν περάσει από τις 00:00:00 UTC την 1η Ιανουαρίου 1970, χωρίς να μετρώνται τα δίσεκτα δευτερόλεπτα. Αυτή η στιγμή ονομάζεται epoch, και επιλέχθηκε από τους πρώτους μηχανικούς του Unix απλώς επειδή ήταν μια βολική στρογγυλή ημερομηνία για να ξεκινήσουν να μετρούν. Στο epoch η τιμή είναι ακριβώς 0. Κάθε δευτερόλεπτο από τότε προσθέτει ένα, οπότε ο αριθμός μόνο μεγαλώνει. Οι ημερομηνίες πριν το 1970 είναι επίσης απολύτως έγκυρες, εκφρασμένες ως αρνητικοί ακέραιοι.

Θα δείτε επίσης αυτή την έννοια να ονομάζεται POSIX time ή, χαλαρά, epoch time. Όποια κι αν είναι η ετικέτα, η μηχανική είναι η ίδια: ένας μοναδικός μετρητής δευτερολέπτων που πάντα αυξάνεται. Επειδή είναι απλός ακέραιος αντί για μορφοποιημένη συμβολοσειρά, ένας υπολογιστής μπορεί να τον αποθηκεύσει σε λίγα bytes και να συγκρίνει δύο από αυτούς με μία μόνο αφαίρεση.

Δευτερόλεπτα, χιλιοστά του δευτερολέπτου, και συγγενικά

Ο κλασικός χρόνος Unix μετράει ολόκληρα δευτερόλεπτα, κάτι που δίνει τον γνώριμο δεκαψήφιο αριθμό που βλέπετε σήμερα. Αλλά πολλά περιβάλλοντα χρειάζονται λεπτότερη ανάλυση. Η JavaScript, για παράδειγμα, δουλεύει σε χιλιοστά του δευτερολέπτου, παράγοντας μια δεκατριψήφια τιμή, και ορισμένα συστήματα πάνε ακόμη παραπέρα σε μικροδευτερόλεπτα ή νανοδευτερόλεπτα. Ένας αξιόπιστος εμπειρικός κανόνας: ένας δεκαψήφιος αριθμός είναι δευτερόλεπτα, δεκατρία ψηφία είναι χιλιοστά του δευτερολέπτου. Αν η μετατρεπόμενη ημερομηνία σας προσγειώνεται κάπου γύρω στο 1970 όταν περιμένατε τη σημερινή μέρα, σχεδόν σίγουρα δώσατε χιλιοστά του δευτερολέπτου σε ένα πεδίο δευτερολέπτων, ή αντίστροφα. Ο μετατροπέας μας εντοπίζει αυτόματα το μέγεθος οπότε σπάνια χρειάζεται να μαντέψετε.

Γιατί οι προγραμματιστές βασίζονται σε αυτό

Το μεγάλο πλεονέκτημα είναι ότι ένα timestamp είναι ουδέτερο ως προς τη ζώνη ώρας. Ο ακέραιος 1735689600 αναφέρεται στην ίδια στιγμή στο Τόκιο, στο Βερολίνο, και στο Σάο Πάολο. Η αποθήκευση αυτού του αριθμού αντί για μια μορφοποιημένη τοπική συμβολοσειρά σημαίνει ότι δεν χρειάζεται ποτέ να αναρωτιέστε σε ποιο ρολόι ανήκε μια τιμή. Η ταξινόμηση είναι επίσης τετριμμένη, γιατί η χρονολογική σειρά είναι απλώς αριθμητική σειρά, οπότε ένα ευρετήριο βάσης δεδομένων πάνω σε μια στήλη timestamp ταξινομεί τα γεγονότα σωστά χωρίς καμία ανάλυση. Η αριθμητική είναι εξίσου καθαρή: το κενό ανάμεσα σε δύο γεγονότα είναι μία αφαίρεση, και η προσθήκη μιας ημέρας είναι η προσθήκη 86400. Αυτές οι ιδιότητες είναι ακριβώς γιατί τα logs, τα tokens, οι caches, και οι ουρές μηνυμάτων όλα καταφεύγουν στον χρόνο epoch.

Μετατροπή και προς τις δύο κατευθύνσεις

Η μετάβαση από ένα timestamp σε μια ανθρώπινη ημερομηνία σημαίνει να πάρετε το πλήθος των δευτερολέπτων και να το προβάλετε σε ένα ημερολόγιο, μετά να το μορφοποιήσετε σε όποια ζώνη ώρας σας ενδιαφέρει. Η αντίστροφη πορεία, παίρνετε ένα έτος, μήνα, ημέρα, και ώρα, αποφασίζετε σε ποια ζώνη ώρας εκφράζεται, και το συμπτύσσετε πίσω σε δευτερόλεπτα από το epoch. Το εργαλείο μας κάνει και τις δύο κατευθύνσεις ακαριαία και εξ ολοκλήρου στο πρόγραμμα περιήγησής σας, οπότε τίποτα από όσα επικολλάτε δεν φεύγει από τη μηχανή σας. Επικολλήστε έναν αριθμό για να τον αποκωδικοποιήσετε, ή επιλέξτε μια ημερομηνία για να την κωδικοποιήσετε, και διαβάστε το αποτέλεσμα και σε UTC και στην τοπική σας ώρα την ίδια στιγμή.

Φωτεινή κορδέλα χρονογραμμής με έναν δείκτη που γλιστράει κατά μήκος μιας ρέουσας ροής δευτερολέπτων epoch
Ένας δείκτης σε μία χρονογραμμή, αναγνώσιμος τόσο ως UTC όσο και ως τοπική ώρα.

UTC εναντίον τοπικής ώρας, η κλασική παγίδα

Το ίδιο το timestamp δεν έχει ζώνη ώρας· είναι πάντα αγκυρωμένο στο UTC. Η σύγχυση εμφανίζεται μόνο όταν το εμφανίζετε. Αν μετατρέψετε το 1700000000 και η οθόνη σας δείχνει μια βραδινή ώρα ενώ ένας συνάδελφος σε άλλη χώρα βλέπει μια απογευματινή ώρα, τίποτα δεν είναι χαλασμένο, κοιτάτε και οι δύο την ίδια στιγμή αποδοσμένη σε διαφορετικά τοπικά ρολόγια. Τα σφάλματα εμφανίζονται όταν ο κώδικας διαβάζει μια τοπική ημερομηνία σαν να ήταν UTC, ή σφραγίζει μια ώρα ρολογιού τοίχου χωρίς να καταγράφει την μετατόπιση. Η ασφαλής συνήθεια είναι να αποθηκεύετε και να μεταδίδετε UTC, και να εφαρμόζετε μια τοπική μετατόπιση μόνο τη τελευταία στιγμή, όταν δείχνετε την τιμή σε έναν άνθρωπο. Όταν έχετε αμφιβολία, συγκρίνετε με τη γραμμή UTC στον μετατροπέα αντί για την τοπική σας.

Το πρόβλημα του έτους 2038

Πολλά παλαιότερα συστήματα αποθήκευαν τον χρόνο Unix σε έναν προσημασμένο ακέραιο 32 bits. Αυτό το πεδίο ξεμένει από χώρο ένα δευτερόλεπτο μετά τις 03:14:07 UTC στις 19 Ιανουαρίου 2038, όταν ο μετρητής υπερχειλίζει και τυλίγεται σε αρνητικό αριθμό, ρίχνοντας πιθανώς τις ημερομηνίες πίσω στο 1901. Είναι το ίδιο είδος ζητήματος με το Y2K. Τα καλά νέα είναι ότι τα σύγχρονα λειτουργικά συστήματα και οι γλώσσες έχουν σε μεγάλο βαθμό μεταβεί σε timestamps 64 bits, τα οποία δεν θα υπερχειλίσουν για περίπου 292 δισεκατομμύρια χρόνια, οπότε για νέο κώδικα είναι κυρίως μια ιστορική περιέργεια που αξίζει να γνωρίζετε παρά μια επείγουσα κατάσταση.

Για περισσότερα βοηθήματα με βάση το πρόγραμμα περιήγησης δείτε τα εργαλεία προγραμματιστών μας, και αν χρειάζεται να δουλέψετε τους ίδιους τους αριθμούς, οι αριθμομηχανές είναι ένα κλικ μακριά.

Συχνές ερωτήσεις

Τι είναι ένα Unix timestamp;

Είναι ο αριθμός των δευτερολέπτων από τις 00:00:00 UTC την 1η Ιανουαρίου 1970, χωρίς να μετρώνται τα δίσεκτα δευτερόλεπτα. Αυτή η αρχική στιγμή ονομάζεται epoch, και η μέτρηση μόνο αυξάνεται με τον χρόνο.

Γιατί ο αριθμός μου μετατρέπεται σε ημερομηνία κοντά στο 1970;

Πιθανότατα μπερδέψατε δευτερόλεπτα και χιλιοστά του δευτερολέπτου. Ένας δεκαψήφιος αριθμός είναι δευτερόλεπτα και ένας δεκατριψήφιος αριθμός είναι χιλιοστά του δευτερολέπτου. Η τροφοδότηση χιλιοστών του δευτερολέπτου σε ένα πεδίο δευτερολέπτων διαιρεί τον φαινομενικό χρόνο περίπου επί χίλια, προσγειώνοντάς σας κοντά στο epoch.

Έχει ζώνη ώρας ένα Unix timestamp;

Όχι. Η τιμή είναι πάντα αγκυρωμένη στο UTC. Μια ζώνη ώρας μπαίνει στο παιχνίδι μόνο όταν εμφανίζετε το timestamp ως ανθρώπινα αναγνώσιμη ημερομηνία, κάτι που εξηγεί γιατί ο ίδιος αριθμός μπορεί να δείχνει διαφορετικές ώρες ρολογιού τοίχου σε διαφορετικούς ανθρώπους.

Πώς μετατρέπω μια ημερομηνία πίσω σε timestamp;

Δώστε το έτος, τον μήνα, την ημέρα, και την ώρα, αποφασίστε σε ποια ζώνη ώρας εκφράζεται αυτή η ημερομηνία, και το εργαλείο τη συμπτύσσει σε δευτερόλεπτα από το epoch. Μπορείτε να κάνετε και τις δύο κατευθύνσεις σε αυτή τη σελίδα ακαριαία στο πρόγραμμα περιήγησής σας.

Τι είναι το πρόβλημα του έτους 2038;

Τα συστήματα που αποθηκεύουν τον χρόνο Unix σε προσημασμένο ακέραιο 32 bits υπερχειλίζουν ένα δευτερόλεπτο μετά τις 03:14:07 UTC στις 19 Ιανουαρίου 2038. Τα σύγχρονα timestamps 64 bits αποφεύγουν αυτό για δισεκατομμύρια χρόνια, οπότε το περισσότερο τρέχον λογισμικό δεν επηρεάζεται.

Στέλνονται τα δεδομένα μου σε server;

Όχι. Η μετατροπή εκτελείται εξ ολοκλήρου στο πρόγραμμα περιήγησής σας, οπότε οποιοδήποτε timestamp ή ημερομηνία επικολλάτε παραμένει στη δική σας συσκευή.