Τι είναι μια Χρονική Σφραγίδα Unix;
Μια χρονική σφραγίδα Unix είναι ένας μοναδικός αριθμός: η μέτρηση των δευτερολέπτων που έχουν παρέλθει από την εποχή Unix, που ορίζεται ως 00:00:00 UTC την 1η Ιανουαρίου 1970. Αυτό είναι όλο. Καμία ζώνη ώρας, καμία συμβολοσειρά ημερομηνίας, κανένα όνομα μήνα — απλώς ένας ακέραιος που αυξάνεται κατά μία μονάδα ανά δευτερόλεπτο.
Επειδή η εποχή είναι σταθερή και καθολική, μια χρονική σφραγίδα όπως 1700000000 σημαίνει την ίδια ακριβώς στιγμή παντού στη Γη. Ένας διακομιστής στο Τόκιο και ένας φορητός υπολογιστής στο Σικάγο θα συμφωνήσουν και οι δύο ότι αναφέρεται στις 14 Νοεμβρίου 2023 στις 22:13:20 UTC. Η τοπική εμφάνιση διαφέρει ανάλογα με τη ζώνη ώρας, αλλά ο υποκείμενος αριθμός δεν αλλάζει ποτέ.
Μια σκόπιμη απλοποίηση: Η ώρα Unix αγνοεί τα δίσεκτα δευτερόλεπτα. Υποθέτει ότι κάθε μέρα έχει ακριβώς 86.400 δευτερόλεπτα, κάτι που δεν είναι απολύτως αληθές στην αστρονομική πραγματικότητα, αλλά διατηρεί την αριθμητική καθαρή. Περισσότερα για αυτό παρακάτω.
Γιατί οι Μηχανικοί τις Αγαπούν
Οι χρονικές σφραγίδες είναι παντού στο λογισμικό — ώρες τροποποίησης αρχείων, εγγραφές βάσεων δεδομένων, απαντήσεις API, πεδία λήξης JWT, γραμμές καταγραφής — και για καλό λόγο:
- Είναι μια ενιαία τιμή. Ένας ακέραιος αποθηκεύει μια πλήρη ημερομηνία και ώρα. Χωρίς ανάλυση, χωρίς ασάφεια για
ΜΜ/ΗΗέναντιΗΗ/ΜΜ. - Είναι ανεξάρτητες από ζώνη ώρας. Ο αριθμός είναι πάντα UTC. Μετατρέπετε σε τοπική ώρα μόνο όταν τον εμφανίζετε σε έναν άνθρωπο.
- Συγκρίνονται και ταξινομούνται εύκολα. Ποιο γεγονός συνέβη πρώτο; Ο μικρότερος ακέραιος. Διάρκεια μεταξύ δύο γεγονότων; Αφαιρέστε τους. η απάντηση είναι σε δευτερόλεπτα.
- Αποθηκεύονται συμπαγή. Ένας μόνο ακέραιος 4 ή 8 byte έναντι μιας μορφοποιημένης συμβολοσειράς.
Γι' αυτό τόσες πολλές υποδομές μιλούν σε δευτερόλεπτα εποχής κάτω από την κουκούλα, ακόμα κι όταν η διεπαφή σας δείχνει ένα φιλικό 2026-07-23. Αν θέλετε να μετακινηθείτε μεταξύ των δύο αναπαραστάσεων, ένα μετατροπέας χρονικής σφραγίδας Unix κάνει τη μετάφραση και προς τις δύο κατευθύνσεις.
Ανάγνωση μιας: Ένα Επεξεργασμένο Παράδειγμα
Πάρτε τη χρονική σφραγίδα 1000000000 — μια διάσημη, επειδή ξεχείλισε σε ζωντανή τηλεόραση μεταξύ των ενθουσιωδών του Unix.
Για να τη διαβάσετε με το χέρι, διαιρείτε τα δευτερόλεπτα σε μεγαλύτερες μονάδες. Χονδρικά, 1.000.000.000 δευτερόλεπτα είναι περίπου 31,7 χρόνια (ένα έτος είναι ~31.556.952 δευτερόλεπτα). Προσθέστε το στην εποχή του 1970 και φτάνετε στο 2001. Η ακριβής στιγμή είναι 09 Σεπτεμβρίου 2001, 01:46:40 UTC.
Σπάνια κάνετε αυτή την αριθμητική χειροκίνητα — κάθε γλώσσα έχει μια ενσωματωμένη συνάρτηση. Στην Python:
```python from datetime import datetime, timezone datetime.fromtimestamp(1000000000, tz=timezone.utc)
2001-09-09 01:46:40+00:00
```
Το βασικό σημείο: η μετατροπή είναι πάντα αγκυρωμένη στην UTC. Η συνάρτηση μετατρέπει μια ακατέργαστη μέτρηση δευτερολέπτων σε μια ημερολογιακή ημερομηνία προχωρώντας μπροστά από την εποχή. Αν θέλετε αντ' αυτού τοπική ώρα, εφαρμόζετε μια μετατόπιση ζώνης ώρας μετά τη μετατροπή UTC — η ίδια η χρονική σφραγίδα δεν φέρει καμία πληροφορία ζώνης.
Το Πρόβλημα του Έτους 2038
Εδώ είναι που η ιστορία γίνεται ενδιαφέρουσα — και όπου πολλά κατά τα άλλα καλοφτιαγμένα συστήματα έχουν ένα ρολόι που χτυπά μέσα τους.
Για δεκαετίες, ο τυπικός τύπος C που χρησιμοποιείται για την αποθήκευση της ώρας Unix, time_t, ήταν συνήθως ένας υπογεγραμμένος ακέραιος 32-bit. Ένας υπογεγραμμένος ακέραιος 32-bit μπορεί να αναπαραστήσει τιμές από −2.147.483.648 έως 2.147.483.647. Αυτό το ανώτερο όριο είναι το πρόβλημα.
Μετρώντας δευτερόλεπτα από την εποχή του 1970, η τιμή 2.147.483.647 επιτυγχάνεται στις 03:14:07 UTC της 19ης Ιανουαρίου 2038. Ένα δευτερόλεπτο αργότερα, ο μετρητής πρέπει να γίνει 2.147.483.648 — αλλά αυτός ο αριθμός δεν χωρά σε έναν υπογεγραμμένο ακέραιο 32-bit. Αντί να συνεχίσει ανοδικά, τα bits υπερχειλίζουν και τυλίγονται στην πιο αρνητική τιμή, −2.147.483.648.
Μια αρνητική χρονική σφραγίδα ερμηνεύεται ως μια στιγμή πριν από την εποχή. Έτσι, το ρολόι όχι απλώς σταματά — πηδά πίσω στις 13 Δεκεμβρίου 1901. Κάθε σύστημα που εμπιστευόταν το 32-bit time_t του ξαφνικά πιστεύει ότι βρίσκεται στις αρχές του εικοστού αιώνα.
Αυτό συχνά ονομάζεται σφάλμα Y2K38 ή Σφάλμα Χιλιετίας Unix, και δομικά είναι το ίδιο είδος υπερχείλισης σταθερού πλάτους που οδήγησε στον πανικό του Έτους 2000 — απλώς πιο μακριά και ριζωμένο σε όρια δυαδικών ακεραίων αντί για διψήφια έτη.
Πού Πραγματικά Δαγκώνει
Οι σύγχρονοι επιτραπέζιοι υπολογιστές και διακομιστές 64-bit διορθώθηκαν σε μεγάλο βαθμό πριν από χρόνια. Ο κίνδυνος συγκεντρώνεται σε μέρη που είναι δύσκολο να ενημερωθούν:
- Ενσωματωμένα και βιομηχανικά συστήματα. Δρομολογητές, ελεγκτές, ιατρικές συσκευές, ηλεκτρονικές μονάδες ελέγχου αυτοκινήτων και υλικό IoT που κυκλοφόρησε με
time_t32-bit και μπορεί να λειτουργεί ανέπαφο για 20+ χρόνια. Πολλές συσκευές που αναπτύσσονται σήμερα θα είναι ακόμα σε υπηρεσία το 2038. - Παλαιός κώδικας C. Εφαρμογές που μεταγλωττίστηκαν με έναν παλιό ορισμό
time_t, ειδικά όπου ο τύπος εισχώρησε σε μορφές αποθήκευσης δίσκου ή πρωτόκολλα δικτύου. - Παλιές βάσεις δεδομένων και συστήματα αρχείων. Μορφές αποθήκευσης που συμπίεζαν χρονικές σφραγίδες σε πεδία 32-bit. Ορισμένα παλαιότερα συστήματα ήδη εμφανίζουν συμπτώματα όταν χειρίζονται ημερομηνίες μακρινού μέλλοντος — σκεφτείτε μια υποθήκη 20 ετών ή μια λήξη πιστοποιητικού που φτάνει μετά το 2038.
Η λειτουργία αποτυχίας δεν είναι πάντα μια δραματική κατάρρευση. Μερικές φορές είναι μια λεπτή λανθασμένη ημερομηνία: ένα ληγμένο διακριτικό που διαβάζεται ως έγκυρο, μια σειρά ταξινόμησης που αντιστρέφεται, μια προγραμματισμένη εργασία που εκτελείται το 1901.
Η Διόρθωση: Χρόνος 64-bit
Η θεραπεία είναι απλή κατ' αρχήν — διευρύνετε το time_t σε 64 bits. Ένας υπογεγραμμένος ακέραιος 64-bit μπορεί να μετρήσει δευτερόλεπτα πολύ πέρα από κάθε πρακτικό ορίζοντα: το σημείο υπερχείλισης βρίσκεται περίπου 292 δισεκατομμύρια χρόνια στο μέλλον, άνετα πέρα από την αναμενόμενη διάρκεια ζωής του Ήλιου.
Τα περισσότερα τρέχοντα λειτουργικά συστήματα έχουν ήδη κάνει αυτή την κίνηση. Το Linux 64-bit χρησιμοποιεί ένα time_t 64-bit. Ακόμα και το Linux 32-bit απέκτησε υποστήριξη χρόνου 64-bit στον πυρήνα και το glibc τα τελευταία χρόνια. Το δύσκολο μέρος δεν είναι η ίδια η διόρθωση — είναι η εύρεση και ανακατασκευή κάθε τελευταίου κομματιού υλικολογισμικού, κάθε αποθηκευμένης μορφής και κάθε δυαδικού αρχείου τρίτου μέρους που εξακολουθεί να υποθέτει 32 bits. Αυτή η εργασία ελέγχου είναι το πραγματικό έργο του 2038.
Πώς Ταιριάζουν τα Δίσεκτα Δευτερόλεπτα
Ο αστρονομικός χρόνος και ο ατομικός χρόνος αποκλίνουν ελαφρώς, οπότε η επίσημη UTC εισάγει περιστασιακά ένα δίσεκτο δευτερόλεπτο για να διατηρεί τα ρολόγια ευθυγραμμισμένα με την περιστροφή της Γης. Η ώρα Unix, εκ σχεδιασμού, προσποιείται ότι αυτά δεν υπάρχουν — κωδικοποιεί σταθερά 86.400 δευτερόλεπτα ανά ημέρα.
Όταν συμβαίνει ένα δίσεκτο δευτερόλεπτο, τα συστήματα συνήθως το "απλώνουν" — κατανέμοντας το επιπλέον δευτερόλεπτο σε ένα παράθυρο (η Google δημοσιοποίησε ένα άπλωμα 24 ωρών) έτσι ώστε κανένα ρολόι να μην χρειαστεί ποτέ να δείξει το αδύνατο 23:59:60. Το αποτέλεσμα: οι χρονικές σφραγίδες Unix παραμένουν ομαλές και μονότονες, με κόστος να είναι ένα μικροσκοπικό κλάσμα δευτερολέπτου εκτός από την αυστηρή UTC κατά τη διάρκεια ενός απλώματος. Για σχεδόν όλο το λογισμικό, αυτός είναι ακριβώς ο συμβιβασμός που θέλετε. Η υπερχείλιση του 2038 είναι ένα πρόβλημα πλάτους ακεραίου. τα δίσεκτα δευτερόλεπτα είναι μια ξεχωριστή, πολύ μικρότερη ιδιορρυθμία ορισμού — μην τα συγχέετε.
Βασικά Συμπεράσματα
- Μια χρονική σφραγίδα Unix είναι δευτερόλεπτα από τις 00:00:00 UTC την 1η Ιανουαρίου 1970, αγνοώντας τα δίσεκτα δευτερόλεπτα.
- Είναι ένας μοναδικός, ανεξάρτητος από ζώνη ώρας ακέραιος — εύκολος στην αποθήκευση, σύγκριση και ταξινόμηση.
- Η μετατροπή είναι πάντα σχετική με την UTC. η τοπική ώρα εφαρμόζεται στη συνέχεια.
- Το
time_t32-bit με υπογραφή υπερχειλίζει στις 03:14:07 UTC της 19ης Ιανουαρίου 2038, τυλίγοντας σε μια αρνητική τιμή και πηδώντας στο 1901. - Η διόρθωση είναι το
time_t64-bit. η προσπάθεια είναι ο έλεγχος ενσωματωμένων και παλαιών συστημάτων.
Θέλετε να το δείτε σε δράση; Επικολλήστε οποιαδήποτε τιμή εποχής στο μετατροπέας χρονικής σφραγίδας Unix για να τη διαβάσετε ως ανθρώπινη ημερομηνία — ή πηγαίνετε αντίστροφα και μετατρέψτε μια ημερομηνία στη χρονική της σφραγίδα.
Συχνές Ερωτήσεις
Είναι μια χρονική σφραγίδα Unix σε δευτερόλεπτα ή χιλιοστά του δευτερολέπτου;
Η κλασική ώρα Unix είναι σε δευτερόλεπτα. Ωστόσο, η JavaScript και πολλά web API χρησιμοποιούν χιλιοστά του δευτερολέπτου από την εποχή, οπότε μια τιμή όπως 1700000000000 είναι 1.000× μεγαλύτερη. Μια γρήγορη ένδειξη: μια χρονική σφραγίδα βασισμένη σε δευτερόλεπτα για μια πρόσφατη ημερομηνία έχει 10 ψηφία. μια σε χιλιοστά έχει 13. Σε περίπτωση αμφιβολίας, ελέγξτε το μέγεθος πριν από τη μετατροπή.
Θα καταρρεύσει το πρόβλημα του Έτους 2038 το τηλέφωνο ή τον φορητό υπολογιστή μου;
Σχεδόν σίγουρα όχι. Τα σύγχρονα λειτουργικά συστήματα 64-bit χρησιμοποιούν ήδη ένα time_t 64-bit, το οποίο ωθεί την υπερχείλιση δισεκατομμύρια χρόνια μπροστά. Η πραγματική έκθεση είναι σε μακρόβιες ενσωματωμένες συσκευές και παλιό λογισμικό που εξακολουθεί να βασίζεται σε χρόνο 32-bit και μπορεί να μην ενημερωθεί πριν από το 2038.
Μπορεί μια χρονική σφραγίδα Unix να είναι αρνητική;
Ναι. Οι αρνητικές τιμές αντιπροσωπεύουν στιγμές πριν από την εποχή του 1970 — για παράδειγμα, το -1 είναι 31 Δεκεμβρίου 1969, 23:59:59 UTC. Αυτό ακριβώς παράγει μια υπερχείλιση 32-bit το 2038, γι' αυτό το ρολόι φαίνεται να πηδά πίσω στο 1901.
Γιατί η ώρα Unix αγνοεί τα δίσεκτα δευτερόλεπτα;
Για να διατηρήσει τα μαθηματικά απλά και προβλέψιμα. Το να αντιμετωπίζεις κάθε μέρα ως ακριβώς 86.400 δευτερόλεπτα σημαίνει ότι οι διάρκειες είναι απλώς αφαίρεση και οι χρονικές σφραγίδες παραμένουν μονότονες. Η μικρή απόκλιση με την αστρονομική UTC αντιμετωπίζεται με το "άπλωμα" του δίσεκτου δευτερολέπτου, το οποίο σχεδόν όλες οι εφαρμογές προτιμούν από το να αντιμετωπίζουν μια ακραία περίπτωση 23:59:60.
Πώς μετατρέπω μια χρονική σφραγίδα χωρίς να γράψω κώδικα;
Χρησιμοποιήστε ένα διαδικτυακό εργαλείο. Το μετατροπέας χρονικής σφραγίδας Unix δέχεται μια τιμή εποχής και εμφανίζει αμέσως την αντίστοιχη UTC και τοπική ημερομηνία-ώρα, και μετατρέπει επίσης ημερολογιακές ημερομηνίες πίσω σε χρονικές σφραγίδες.