Tools Blog

Τι είναι το Unix Epoch Time; Οδηγός προγραμματιστή για χρονικές σημάνσεις

Unix Epoch Timestamp Explained

Εάν έχετε ποτέ ερωτηθεί για μια βάση δεδομένων ή έχετε εργαστεί με ένα σύγχρονο API, πιθανότατα έχετε δει ημερομηνίες που επιστρέφονται όχι ως "12 Οκτωβρίου 2026", αλλά ως μια τεράστια, τρομακτική σειρά αριθμών όπως 1791800000. Αυτή είναι μια Χρονοσήμανση Unix και είναι η παγκόσμια ραχοκοκαλιά της χρονομέτρησης στην επιστήμη των υπολογιστών.

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

🎥 Εκπαιδευτικό βίντεο: The Y2K38 Problem and Epoch Time (Placeholder για ενσωματωμένο εννοιολογικό σεμινάριο YouTube)

The Origin: 1 Ιανουαρίου 1970

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

Γιατί 1970; Γιατί στις αρχές της δεκαετίας του 1970, η αποθήκευση ήταν απίστευτα ακριβή. Η αποθήκευση μιας ημερομηνίας ως αναγνώσιμη από τον άνθρωπο συμβολοσειρά, όπως "1970-01-01 00:00:00" καταλαμβάνει σχεδόν 20 byte μνήμης. Η αποθήκευσή του ως μεμονωμένος ακέραιος 32-bit χρειάστηκε μόνο 4 byte. Κάνοντας το σημείο εκκίνησης κοντά στη στιγμή που εφευρέθηκε το Unix, μεγιστοποιούσαν τον μελλοντικό χρόνο που θα μπορούσαν να αποθηκεύσουν μέσα σε αυτά τα 4 byte.

Γιατί οι προγραμματιστές αγαπούν τα Unix Timestamps

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

Εάν αποθηκεύσετε ένα συμβάν σε μια βάση δεδομένων χρησιμοποιώντας την ώρα του τοπικού διακομιστή ("03:00 PM EST") και αργότερα μεταφέρετε τον διακομιστή σας στο Λονδίνο, όλα τα μαθηματικά σας διακόπτονται. Αλλά αν ένα συμβάν συμβαίνει στη χρονική σήμανση 1700000000, αυτός ο αριθμός είναι πανομοιότυπος είτε ο χρήστης που το ερώτημά του βρίσκεται στο Τόκιο, στη Νέα Υόρκη ή στο Παρίσι. Η εφαρμογή frontend παίρνει απλώς αυτόν τον ακέραιο αριθμό και τον μετατρέπει μαθηματικά στην τοπική ζώνη ώρας του χρήστη στην οθόνη του.

Μετατρέψτε τις χρονικές σημάνσεις αμέσως

Μην προσπαθήσετε να υπολογίσετε διανοητικά δευτερόλεπτα. Χρησιμοποιήστε το εργαλείο μας εκτός σύνδεσης για να μεταφράσετε άμεσα 10ψήφιες ή 13ψήφιες χρονικές σημάνσεις σε ημερομηνίες αναγνώσιμες από τον άνθρωπο στην τοπική σας ζώνη ώρας.

Ανοίξτε τον μετατροπέα χρονικής σφραγίδας

Δευτερόλεπτα εναντίον χιλιοστών του δευτερολέπτου (ο κανόνας 10 έναντι 13 ψηφίων)

Ένα από τα πιο κοινά σφάλματα στην ανάπτυξη ιστού είναι η μετάδοση μιας χρονικής σήμανσης σε μια συνάρτηση και η λήψη ημερομηνίας το έτος 1970 ή το έτος 52.000. Αυτό συμβαίνει λόγω μιας μίξης μεταξύ δευτερολέπτων και χιλιοστών του δευτερολέπτου.

  • Τυπικός χρόνος Unix (δευτερόλεπτα): Ένας 10ψήφιος αριθμός (π.χ. 1700000000). Αυτό είναι το πρότυπο σε Linux, PHP και στις περισσότερες βάσεις δεδομένων υποστήριξης όπως η MySQL.
  • Χρόνος JavaScript (χιλιοστά του δευτερολέπτου): Ένας 13ψήφιος αριθμός (π.χ. 1700000000000). Η συνάρτηση Date.now() της JavaScript περιλαμβάνει χιλιοστά του δευτερολέπτου για μεγαλύτερη ακρίβεια.

Εάν τροφοδοτήσετε μια 10ψήφια χρονική σήμανση υποστήριξης σε JavaScript χωρίς να την πολλαπλασιάσετε με το 1000, η ​​JavaScript υποθέτει ότι μιλάτε για τις πρώτες ημέρες του Ιανουαρίου 1970.

// Correctly handling a Unix timestamp in JavaScript
const backendTimestamp = 1700000000;
const dateObject = new Date(backendTimestamp * 1000);

console.log(dateObject.toLocaleDateString()); // Converts to local user timezone

Πρόβλημα του έτους 2038 (Y2K38)

Ο χρόνος Unix έχει μια διαφαινόμενη προθεσμία. Επειδή αρχικά είχε αποθηκευτεί ως υπογεγραμμένος ακέραιος αριθμός 32 bit, ο μέγιστος αριθμός που μπορεί να κρατήσει είναι 2,147,483,647.

Στις 19 Ιανουαρίου 2038, στις 03:14:07 UTC, το ρολόι Unix θα χτυπήσει αυτόν τον μέγιστο αριθμό. Ένα δευτερόλεπτο αργότερα, ο ακέραιος αριθμός θα ξεχειλίσει, γυρίζοντας σε αρνητικό αριθμό. Τα παλαιού τύπου συστήματα που δεν έχουν αναβαθμιστεί σε αρχιτεκτονική 64-bit θα πιστέψουν ξαφνικά ότι το έτος είναι 1901, προκαλώντας καταστροφικές αποτυχίες στο λογισμικό παγκοσμίως.

Ευτυχώς, σχεδόν όλο το σύγχρονο υλικό, βάσεις δεδομένων και γλώσσες προγραμματισμού (όπως οι πυρήνες Linux 64-bit και οι σύγχρονοι Node.js) έχουν ήδη μεταβεί σε χρόνο 64-bit, ωθώντας την επόμενη υπερχείλιση δισεκατομμυρίων ετών στο μέλλον.

Συχνές Ερωτήσεις (FAQ)

Ο χρόνος Unix υπολογίζει τα άλματα δευτερόλεπτα;

Παραδόξως, όχι. Ο χρόνος Unix υποθέτει ότι κάθε μέρα έχει ακριβώς 86.400 δευτερόλεπτα. Όταν ο κόσμος προσθέτει ένα "άλμα δευτερόλεπτο" για να προσαρμοστεί στην περιστροφή της Γης, τα συστήματα Unix συνήθως επαναλαμβάνουν την ίδια χρονική σήμανση δύο φορές για να παραμείνουν συγχρονισμένοι χωρίς να παραβιάζουν τους μαθηματικούς υπολογισμούς.

Μπορεί ένα Unix Timestamp να είναι αρνητικό;

Ναί. Οποιαδήποτε χρονική σήμανση μικρότερη από 0 αντιπροσωπεύει μια ημερομηνία πριν από την εποχή Unix (1 Ιανουαρίου 1970). Για παράδειγμα, το -86400 αντιπροσωπεύει ακριβώς την 31η Δεκεμβρίου 1969.

Γιατί η ημερομηνία μετατροπής εμφανίζεται πάντα ως το 1970;

Πιθανότατα μεταβιβάζετε μια χρονική σήμανση 10 ψηφίων σε μια συνάρτηση που αναμένει 13 ψηφία (χιλιοστά του δευτερολέπτου). Πολλαπλασιάστε τη χρονική σας σήμανση επί 1000 πριν τη μετατρέψετε.