Λανθασμένες αντιλήψεις των προγραμματιστών για το Unix Time

ΖΗΤΩ συγγνωμη Πάτρικ ΜακΚένζι.

Χτες Danny Ρώτησα για μερικά ενδιαφέροντα στοιχεία σχετικά με το χρόνο Unix και θυμήθηκα ότι μερικές φορές λειτουργεί εντελώς αδιόρατα.

Αυτά τα τρία γεγονότα φαίνονται εξαιρετικά λογικά και λογικά, έτσι δεν είναι;

  1. Ο χρόνος Unix είναι ο αριθμός των δευτερολέπτων από την 1η Ιανουαρίου 1970 00:00:00 UTC.
  2. Εάν περιμένετε ακριβώς ένα δευτερόλεπτο, ο χρόνος Unix θα αλλάξει κατά ακριβώς ένα δευτερόλεπτο.
  3. Ο χρόνος Unix δεν κινείται ποτέ προς τα πίσω.

Τίποτα από αυτά δεν είναι αλήθεια.

Αλλά δεν αρκεί να πούμε απλώς, «Τίποτα από όλα αυτά δεν είναι αλήθεια», χωρίς να εξηγήσουμε. γιατί. Δείτε παρακάτω για εξηγήσεις. Αλλά αν θέλετε να σκεφτείτε μόνοι σας, μην περάσετε από την εικόνα του ρολογιού!

Λανθασμένες αντιλήψεις των προγραμματιστών για το Unix Time
Επιτραπέζιο ρολόι από τη δεκαετία του 1770. Συντάχθηκε από τον John Leroux. Από Καλωσορίσατε συλλογές. Δημοσιεύεται με άδεια CC BY

Και οι τρεις παρανοήσεις έχουν έναν λόγο: άλματα δευτερόλεπτα. Εάν δεν είστε εξοικειωμένοι με τα άλματα δευτερόλεπτα, εδώ είναι μια γρήγορη αναφορά:

Ο χρόνος UTC καθορίζεται από δύο παράγοντες:

  • Διεθνής Ατομική Ώρα: Μέσες ενδείξεις από εκατοντάδες ατομικά ρολόγια σε όλο τον κόσμο. Μπορούμε να μετρήσουμε το δεύτερο με τις ηλεκτρομαγνητικές ιδιότητες ενός ατόμου, και αυτή είναι η πιο ακριβής μέτρηση του χρόνου που είναι γνωστή στην επιστήμη.
  • Παγκόσμια ώρα, με βάση την περιστροφή της Γης γύρω από τον άξονά της. Μια πλήρης επανάσταση είναι μια μέρα.

Το πρόβλημα είναι ότι αυτοί οι δύο αριθμοί δεν ταιριάζουν πάντα. Η περιστροφή της Γης δεν είναι συνεπής - σταδιακά επιβραδύνεται, έτσι οι μέρες στον Παγκόσμιο Χρόνο γίνονται μεγαλύτερες. Από την άλλη, τα ατομικά ρολόγια είναι διαβολικά ακριβή και σταθερά για εκατομμύρια χρόνια.

Όταν δύο φορές πέφτουν εκτός συγχρονισμού, προστίθεται ή αφαιρείται ένα δεύτερο από το UTC για να συγχρονιστούν ξανά. Από το 1972 υπηρεσία IERS (που τρέχει αυτή την περίπτωση) πρόσθεσε 27 επιπλέον δευτερόλεπτα. Το αποτέλεσμα ήταν 27 ημέρες UTC με διάρκεια 86 δευτερόλεπτα. Θεωρητικά, είναι δυνατή μια ημέρα με διάρκεια 401 δευτερόλεπτα (μείον ένα). Και οι δύο επιλογές έρχονται σε αντίθεση με τη θεμελιώδη υπόθεση του χρόνου Unix.

Ο χρόνος Unix υποθέτει ότι κάθε μέρα διαρκεί ακριβώς 86 δευτερόλεπτα (400 × 60 × 60 = 24), χωρίς επιπλέον δευτερόλεπτα. Εάν συμβεί ένα τέτοιο άλμα, τότε ο χρόνος Unix είτε πηδά ένα δευτερόλεπτο, είτε μετράει δύο δευτερόλεπτα σε ένα. Από το 86, του λείπουν 400 δίσεπτα.

Επομένως, οι λανθασμένες αντιλήψεις μας πρέπει να συμπληρωθούν ως εξής:

  • Ο χρόνος Unix είναι ο αριθμός των δευτερολέπτων από την 1η Ιανουαρίου 1970 00:00:00 UTC μείον άλματα δευτερόλεπτα.
  • Εάν περιμένετε ακριβώς ένα δευτερόλεπτο, ο χρόνος Unix θα αλλάξει κατά ακριβώς ένα δευτερόλεπτο, εκτός αν έχει αφαιρεθεί το πήδημα δευτερόλεπτο.

    Μέχρι τώρα, τα δευτερόλεπτα δεν έχουν αφαιρεθεί ποτέ στην πράξη (και η επιβράδυνση της περιστροφής της Γης σημαίνει ότι αυτό είναι απίθανο), αλλά αν συνέβαινε ποτέ, θα σήμαινε ότι η ημέρα UTC θα γινόταν κατά ένα δευτερόλεπτο μικρότερη. Σε αυτήν την περίπτωση, το τελευταίο δευτερόλεπτο του UTC (23:59:59) απορρίπτεται.

    Κάθε ημέρα Unix έχει τον ίδιο αριθμό δευτερολέπτων, επομένως το τελευταίο δευτερόλεπτο Unix μιας συντομευμένης ημέρας δεν θα αντιστοιχεί σε καμία ώρα UTC. Δείτε πώς φαίνεται, σε διαστήματα τέταρτου του δευτερολέπτου:

    Λανθασμένες αντιλήψεις των προγραμματιστών για το Unix Time

    Εάν ξεκινήσετε στις 23:59:58:00 UTC και περιμένετε ένα δευτερόλεπτο, η ώρα Unix θα προχωρήσει δύο δευτερόλεπτα UTC και η χρονική σήμανση Unix 101 δεν θα εκχωρηθεί σε κανέναν.

  • Ο χρόνος Unix δεν μπορεί ποτέ να γυρίσει πίσω, μέχρι να προστεθεί ένα άλμα δευτερόλεπτο.

    Αυτό έχει συμβεί ήδη 27 φορές στην πράξη. Στο τέλος της ημέρας UTC, προστίθεται ένα επιπλέον δευτερόλεπτο στις 23:59:60. Το Unix έχει τον ίδιο αριθμό δευτερολέπτων σε μια ημέρα, επομένως δεν μπορεί να προσθέσει ένα επιπλέον δευτερόλεπτο - αντίθετα πρέπει να επαναλάβει τις χρονικές σημάνσεις Unix για το τελευταίο δευτερόλεπτο. Δείτε πώς φαίνεται, σε διαστήματα τέταρτου του δευτερολέπτου:

    Λανθασμένες αντιλήψεις των προγραμματιστών για το Unix Time

    Αν ξεκινήσετε στις 23:59:60.50 και περιμένετε μισό δευτερόλεπτο, η ώρα Unix επιστρέφει κατά μισό δευτερόλεπτο και η χρονική σήμανση Unix 101 αντιστοιχεί σε δύο δευτερόλεπτα UTC.

Αυτές δεν είναι πιθανώς οι μόνες παραξενιές των καιρών Unix - ακριβώς αυτό που θυμήθηκα χθες.

Χρόνος - πολύ περίεργο πράγμα.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο