Χρόνος σε δευτερόλεπτα από το 1970. Χρόνος Unix και Timestamp Unix (MySQL, PHP, JavaScript)

Μόνο για τους αναγνώστες του Lifeexample είναι δυνατό να ανοίξουν ένα ηλεκτρονικό κατάστημα στο Moguta.CMS με έκπτωση 15%

Unix time και Unix Timestamp (MySQL, PHP, JavaScript)

Γεια σας, αγαπητοί αναγνώστες του ιστολογίου, σε αυτό το άρθρο, θέλω να σας πω τι είναι Χρόνος UnixΚαι Unix Timestamp. Οι προγραμματιστές συχνά συνδυάζουν αυτές τις έννοιες σε μία, αλλά αυτό δεν είναι απολύτως αληθές. Επιπλέον, το άρθρο περιέχει πολλές χρήσιμες σημειώσεις σχετικά με την εργασία με Unix Timestamp σε PHP, MySQL και JavaScript.

Γιατί η ώρα Unix ξεκινά την 1η Ιανουαρίου 1970

Το θέμα είναι ότι ο χρόνος Unix αρχίζει να μετράει την εποχή Unix με την κυκλοφορία του πρώτου συστήματος UNIX. Το πρώτο σύστημα αυτού του είδους δημιουργήθηκε το 1969, έτσι οι προγραμματιστές πήραν την ημερομηνία 1 Ιανουαρίου 1970 τα μεσάνυχτα UTC ( UTC).

Ας καταλάβουμε τι χρησιμεύουν το Unix time και το Unix Timestamp και ας τους δώσουμε σαφείς έννοιες.

Unix Timestampείναι μια χρονική σήμανση που είναι μια ακολουθία χαρακτήρων που αντιπροσωπεύει τον αριθμό των δευτερολέπτων που έχουν περάσει από την 1η Ιανουαρίου 1970.

Θα προσπαθήσω να δώσω ένα παράδειγμα για να διευκρινίσω τη διαφορά μεταξύ αυτών των δύο εννοιών.

Τη στιγμή της συγγραφής αυτής της ανάρτησης, Χρόνος Unixήταν ίσος 1346765877 .

Ενώ διαβάζετε αυτές τις πληροφορίες, ένα ρεκόρ χρόνου ( 1346765877 ) είναι ήδη ετικέτα - Unix Timestamp! Μετατρέποντας αυτήν τη χρονική σήμανση σε μορφή αναγνώσιμη από τον άνθρωπο, έχουμε την ημερομηνία 04-09-2012 και ώρα 17:37:57.

Ειλικρινά μιλώντας, κατά τη γνώμη μου, δεν υπάρχει ιδιαίτερο νόημα στον διαχωρισμό των δύο εννοιών, αλλά εξακολουθεί να είναι χρήσιμο να έχουμε μια ιδέα για το τι είναι Unix Time, και είναι επίσης χρήσιμο να κατανοήσουμε ότι ο αριθμός των μέγιστων δυνατών δευτερολέπτων που έχουν περάσει από το 1970 έχει ένα όριο!

Το τέλος της εποχής του Unix θα έρθει το 2038

Γεγονός:ο μέγιστος δυαδικός αριθμός σε συστήματα 32 bit είναι ο αριθμός 01111111 11111111 11111111 11111111 , μετατρέποντάς το στο δεκαδικό σύστημα, παίρνουμε τον αριθμό 2147483647.

19 Ιανουαρίου 2038στις 03:14:08 θα έρθει μια στιγμή που ο αριθμός των δευτερολέπτων που έχουν περάσει από την αρχή της εποχής Unix υπερβαίνει το μέγιστο διαθέσιμο σε ένα σύστημα 32 bit, αριθμός = 2147483647. Εάν το bit υπερχειλίσει, η ημερομηνία θα είναι επαναφορά.

Είναι πολύ εύκολο να δοκιμαστεί αυτή η θεωρία με ένα σαφές παράδειγμα:

  • Ανοίξτε μια τυπική αριθμομηχανή Windows, πατήστε ALT+3, αυτό θα τη μετατρέψει σε μηχανική προβολή.
  • Ορίστε τη λειτουργία 4 byte και τον τύπο εισόδου δεκαδικού.
  • Γράψτε τον αριθμό 2147483647;

  • Δώστε προσοχή στην αναπαράσταση του αριθμού σε δυαδικό.
  • Προσθέστε ένα στον αριθμό.

  • Το αποτέλεσμα της πρόσθεσης θα είναι αρνητικός αριθμός!

Αν συνεχίσουμε να προσθέτουμε ένα, έχουμε κυκλικό κλείσιμο.

Είναι αυτή η ημερομηνία που θα κουδουνίσει από τις 19 Ιανουαρίου 2038 σε όλα τα συστήματα που χρησιμοποιούν αρχιτεκτονική 32 bit.

Στην πραγματικότητα, δεν χρειάζεται να είμαστε λυπημένοι, επειδή οι προγραμματιστές συστημάτων υπολογιστών εισάγουν όλο και περισσότερο αρχιτεκτονικές 64-bit σε ευρεία χρήση. Ας πιστέψουμε ότι θα τα καταφέρουν μέχρι το 2038.

Τώρα ας μιλήσουμε για τη χρήση της χρονικής σφραγίδας unix php, mysqlκαι μάλιστα μέσα javascript.

Εργασία με χρονική σήμανση unix

Ένα πολύ σημαντικό σημείο όταν εργάζεστε με unix timestamp σε php ή mysql είναι η ανάγκη να κατανοήσετε ξεκάθαρα τα πλεονεκτήματα και τα μειονεκτήματα αυτής της μορφής ημερομηνίας.

Για παράδειγμα, ΧΡΟΝΟΣΗΜΑδεν μπορεί να χρησιμοποιηθεί για τον προσδιορισμό ιστορικών γεγονότων ή γεγονότων του απώτερου μέλλοντος. Το σύνολο των ημερομηνιών περιορίζεται στην περίοδο από το 1970 έως τις αρχές του 2038. Εάν ορίσετε μια ημερομηνία πέραν του 2038, δεν θα ερμηνευτεί σωστά από το σύστημα 32-bit.

Συνειδητοποιώντας αυτόν τον περιορισμό, προκύπτει ένα λογικό ερώτημα: " Γιατί να μπείτε στον κόπο να αναπαραστήσετε ημερομηνίες σε δευτερόλεπτα;"

Πότε να χρησιμοποιήσετε το Unix Timestamp

Για να αναπαραστήσουμε τον χρόνο στο συνηθισμένο μας σύστημα μέτρησής του, απαιτούνται 8 byte και για μια χρονική σήμανση unix είναι το μισό - 4 byte.

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

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

Η MySQL παρέχει έναν αντίστοιχο τύπο δεδομένων Timestamp για εργασία με τη μορφή ώρας Unix, εγκαθιστώντας την οποία έχουμε αμέσως ένα χρήσιμο πλεονέκτημα έναντι των τυπικών μορφών ΗΜΕΡΟΜΗΝΙΑΚαι ΗΜΕΡΟΜΗΝΙΑ ΩΡΑ. Το πλεονέκτημα είναι ότι όταν προσθέτετε μια νέα εγγραφή σε έναν πίνακα, η στήλη με αυτόν τον τύπο δεδομένων συμπληρώνεται αυτόματα. Αυτό σημαίνει ότι μπορούμε να εξοικονομήσουμε όχι μόνο την ποσότητα δεδομένων, αλλά και τον χρόνο CPU του διακομιστή web.

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

Εάν ο τύπος του πεδίου που αποθηκεύει την ημερομηνία στον πίνακα είναι ΗΜΕΡΟΜΗΝΙΑ ΩΡΑ, τότε το αίτημα από το σενάριο PHP θα μοιάζει κάπως έτσι:

Τα οφέλη είναι προφανή!

Υπάρχει επίσης ένα μείον: εάν υπάρχουν πολλά πεδία τύπου TIMESTAMP, μόνο το πρώτο ενημερώνεται αυτόματα.

Έχει νόημα η χρήση INT αντί για timestamp;

Πολλοί προγραμματιστές, όταν εργάζονται με unix timestamp, χρησιμοποιούν την ακέραια μορφή int(11) . Αυτή είναι μια εντελώς παράλογη προσέγγιση του ζητήματος, καθώς η MySQL παρέχει πολλές χρήσιμες λειτουργίες για τον τύπο της χρονικής σήμανσης που επηρεάζουν την ταχύτητα εργασίας με αυτήν. Επομένως, αποθηκεύοντας τη χρονική σήμανση στο INT, θα στερήσουμε από τον εαυτό μας κάθε υποστήριξη διακομιστή για αυτήν τη μορφή. Αυτό είναι περίπου το ίδιο με την αποθήκευση αναγνωριστικού στον τύπο varchar(11).

Ωστόσο, υπάρχει μια δικαιολογία για τη διατήρηση unix timestamp σε INT. Κατά τη μεταφορά μιας βάσης δεδομένων μεταξύ διαφορετικών DBMS, μπορεί να προκύψει μια διένεξη τύπου, π.χ. Για ένα από τα DBMS, ο τύπος χρονικής σήμανσης μπορεί να είναι άγνωστος. Σε αυτήν την περίπτωση, η χρήση του int θα έχει πλεονέκτημα, καθώς αυτή η μορφή είναι διαθέσιμη σε όλα τα DBMS.

Σύντομη περιγραφή των τύπων ημερολογίων MySQL

ΧΡΟΝΟΣΗΜΑ- τύπος δεδομένων για αποθήκευση ημερομηνίας και ώρας. Τα δεδομένα αποθηκεύονται ως ο αριθμός των δευτερολέπτων που έχουν περάσει από την έναρξη της «εποχής Unix». Εύρος τιμών: 1970-01-01 00:00:00 - 2038-12-31 00:00:00. Καταλαμβάνει 4 byte.

ΗΜΕΡΟΜΗΝΙΑ- τύπος δεδομένων για αποθήκευση ημερομηνιών. Εύρος τιμών: 1000-01-01 - 9999-12-31. Καταλαμβάνει 3 byte.

ΗΜΕΡΟΜΗΝΙΑ ΩΡΑ- τύπος δεδομένων για αποθήκευση ημερομηνίας και ώρας. Εύρος τιμών: 1000-01-01 00:00:00 - 9999-12-31 00:00:00. Χρειάζεται 8 byte και αποθηκεύεται ως αριθμός YYYYMMDDHHMMSS./p>

ΕΤΟΣ- τύπος δεδομένων για την αποθήκευση του έτους. Εύρος τιμών: 1901 - 2155. Καταλαμβάνει 1 byte.

ΧΡΟΝΟΣ- τύπος δεδομένων για αποθήκευση χρόνου. Εύρος τιμών: −828:59:59 - 828:59:59. Καταλαμβάνει 3 byte.

Μετατροπή ημερομηνίας σε unix

Ήρθε η ώρα να δημοσιεύσετε μερικές χρήσιμες λειτουργίες για τη μετατροπή ημερομηνιών σε χρονοσήμανση unixκαι πίσω από unix-timeσε ευανάγνωστη ημερομηνία.

Πώς να λάβετε την τρέχουσα ώρα UNIX

  • PHP:

    χρόνος();

  • JavaScript:

    Math.round(new Date().getTime()/1000.0);

  • MySQL:

    SELECT unix_timestamp(now() );

Τι είναι η ώρα Unix ή η εποχή Unix (εποχή Unix ή ώρα Unix ή ώρα POSIX ή χρονική σήμανση Unix);

Η ώρα UNIX ή η ώρα POSIX είναι μια μέθοδος κωδικοποίησης χρόνου που υιοθετείται στο UNIX και σε άλλα λειτουργικά συστήματα συμβατά με POSIX.
Το σημείο εκκίνησης θεωρείται ότι είναι τα μεσάνυχτα (UTC) από τις 31 Δεκεμβρίου 1969 έως την 1η Ιανουαρίου 1970, η ώρα από αυτή τη στιγμή ονομάζεται «εποχή UNIX» (αγγλική εποχή Unix).
Ο χρόνος UNIX είναι συνεπής με το UTC, ειδικότερα, όταν δηλώνονται δίσεκτα UTC, επαναλαμβάνονται οι αντίστοιχοι δεύτεροι αριθμοί.
Η μέθοδος αποθήκευσης του χρόνου με τη μορφή ενός αριθμού δευτερολέπτων είναι πολύ βολική στη χρήση κατά τη σύγκριση ημερομηνιών (ακριβής με τη δεύτερη), καθώς και για την αποθήκευση ημερομηνιών: εάν είναι απαραίτητο, μπορούν να μετατραπούν σε οποιαδήποτε μορφή αναγνώσιμη από τον άνθρωπο. Η ημερομηνία και η ώρα σε αυτήν τη μορφή καταλαμβάνουν επίσης πολύ λίγο χώρο (4 ή 8 byte, ανάλογα με το μέγεθος της λέξης του μηχανήματος), επομένως είναι λογικό να χρησιμοποιείται για την αποθήκευση μεγάλων ποσοτήτων ημερομηνιών. Μειονεκτήματα απόδοσης μπορεί να προκύψουν όταν γίνεται πολύ συχνή πρόσβαση σε στοιχεία ημερομηνίας, όπως αριθμοί μηνών κ.λπ.. Ωστόσο, στις περισσότερες περιπτώσεις, είναι πιο αποτελεσματικό να αποθηκεύεται ο χρόνος ως μια μεμονωμένη τιμή παρά ως μια συλλογή πεδίων.

Μετατροπή της εποχής του Unix σε αναγνώσιμη ημερομηνία από τον άνθρωπο


Unix ημερομηνία έναρξης και λήξης του έτους, του μήνα ή της ημέρας


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


Πώς να αποκτήσετε χρόνο Unix σε...

Perlχρόνος
PHPχρόνος()
ΡουμπίνιTime.now (ή Time.new). Για έξοδο: Time.now.to_i
ΠύθωνΠρώτα εισαγωγή χρόνου και μετά time.time()
Ιάβαlong epoch = System.currentTimeMillis()/1000;
Microsoft .NET C#epoch = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
VBScript/ASPDateDiff("s", "01/01/1970 00:00:00", Τώρα())
Erlangcalendar:datetime_to_gregorian_seconds(calendar:now_to_universal_time(now()))-719528*24*3600.
MySQLSELECT unix_timestamp(τώρα())
PostgreSQLSELECT απόσπασμα(εποχή ΑΠΟ τώρα());
SQL ServerSELECT DATEDIFF(s, "1970-01-01 00:00:00", GETUTCDATE())
JavaScriptMath.round(new Date().getTime()/1000.0) getTime() επιστρέφει την ώρα σε χιλιοστά του δευτερολέπτου.
Unix/Linuxημερομηνία +%s
Άλλα ΛΣΓραμμή εντολών: perl -e "χρόνος εκτύπωσης" (Εάν το Perl είναι εγκατεστημένο στο σύστημά σας)

Μετατροπή ημερομηνίας σε ώρα Unix σε...

PHPmktime( παρακολουθώ, λεπτά, δευτερόλεπτα, μήνας, ημέρα, έτος)
ΡουμπίνιTime.local( έτος, μήνας, ημέρα, παρακολουθώ, λεπτά, δευτερόλεπτα, χρήσηc) (ή Time.gm για έξοδο GMT/UTC). Για έξοδο add.to_i
Πύθωνπρώτα εισαγωγή χρόνου και μετά int(time.mktime(time.strptime("2000-01-01 12:34:00", "%Y-%m-%d %H:%M:%S")))
Ιάβαlong epoch = new java.text.SimpleDateFormat("ηη/ΜΜ/εεεε ΩΩ:λλ:δδ").parse("01/01/1970 01:00:00");
VBScript/ASPDateDiff("s", "01/01/1970 00:00:00", πεδίο ημερομηνίας)
MySQLSELECT unix_timestamp( χρόνος) Μορφή ώρας: ΕΕΕΕ-ΜΜ-ΗΗ ΩΩ:ΜΛ:ΔΔ ή ΕΕΕΜΗΗ ή ΕΕΕΕΜΗΗ
PostgreSQLSELECT απόσπασμα(εποχή FROM ημερομηνία("2000-01-01 12:34"));
Με χρονική σήμανση: SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE "2001-02-16 20:38:40-08"); Με διάστημα: SELECT EXTRACT(EPOCH FROM INTERVAL "5 ημέρες 3 ώρες");
SQL ServerSELECT DATEDIFF(s, "1970-01-01 00:00:00", πεδίο ημερομηνίας)
Unix/Linuxημερομηνία +%s -d"1 Ιανουαρίου 1980 00:00:01"

Μετατροπή χρόνων Unix σε αναγνώσιμες από τον άνθρωπο ημερομηνίες...

PHPημερομηνία( Μορφή, χρόνο unix);
ΡουμπίνιTime.at( χρόνο unix)
Πύθωνπρώτα εισαγωγή χρόνου, μετά time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.localtime( χρόνο unix)) Αντικαταστήστε το time.localtime με time.gmtime για την ημερομηνία GMT.
ΙάβαΗμερομηνία συμβολοσειράς = new java.text.SimpleDateFormat("ηη/ΜΜ/εεεε ΩΩ:λλ:δδ").format(new java.util.Date ( χρόνο unix*1000));
VBScript/ASPDateAdd("s", χρόνο unix, "01/01/1970 00:00:00")
PostgreSQLΕΠΙΛΕΞΤΕ ΧΡΟΝΟΣΗΜΑ ΜΕ "εποχή" + ΖΩΝΗΣ ΩΡΑΣ χρόνο unix* ΔΙΑΣΤΗΜΑ "1 δευτερόλεπτο";
MySQLfrom_unixtime( χρόνο unix, προαιρετική, μορφή εξόδου) Τυπική μορφή εξόδου ΕΕΕ-ΜΜ-ΗΗ ΩΩ:ΜΛ:ΔΔ
SQL ServerDATEADD(s, χρόνο unix, "1970-01-01 00:00:00")
Microsoft Excel=(A1 / 86400) + 25569 Το αποτέλεσμα θα είναι στη ζώνη ώρας GMT. Για άλλες ζώνες ώρας: =((A1 +/- διαφορά ώρας για τη ζώνη) / 86400) + 25569.
Linuxημερομηνία -d @1190000000
Άλλα ΛΣΓραμμή εντολών: perl -e "print scalar(localtime( χρόνο unix))" (Εάν είναι εγκατεστημένο το Perl) Αντικαταστήστε το "localtime" με το "gmtime" για τη ζώνη ώρας GMT/UTC.

Σε τι χρησιμεύει το εργαλείο "Unixtime Converter";

Αυτό το εργαλείο θα είναι κυρίως χρήσιμο σε webmasters που ασχολούνται συνεχώς με μεγάλους όγκους ημερομηνιών ή συχνά αναφέρονται στα στοιχεία τους στη δουλειά τους. Χρησιμοποιώντας το εργαλείο "Unixtime Converter", μπορείτε εύκολα να μετατρέψετε την ώρα Unix σε μια φιλική προς το χρήστη ημερομηνία (και το αντίστροφο), να μάθετε την τρέχουσα ώρα της εποχής Unix και επίσης να λάβετε χρόνο Unix σε διάφορες γλώσσες προγραμματισμού, DBMS και λειτουργικά συστήματα.

Τι είναι η ώρα Unix;

Η εποχή Unix (εποχή Unix) ξεκίνησε τη νύχτα της 31ης Δεκεμβρίου 1969 προς την 1η Ιανουαρίου 1970. Ήταν αυτή η ημερομηνία που λήφθηκε ως το σημείο εκκίνησης του χρόνου "υπολογιστή", ο οποίος υπολογίζεται σε δευτερόλεπτα και καταλαμβάνει πολύ λίγο χώρο στο δίσκο - μόνο 4 ή 8 byte. Με αυτήν τη μέθοδο κωδικοποίησης, οι προγραμματιστές μπορούν να "κρύψουν" οποιαδήποτε ημερομηνία σε έναν μόνο αριθμό και να την μετατρέψουν εύκολα σε μια μορφή που μπορούν να κατανοήσουν οι χρήστες.

Ο χρόνος Unix (ονομάζεται επίσης χρόνος Unix ή χρόνος POSIX) είναι βολικός στη χρήση σε διάφορα λειτουργικά συστήματα και γλώσσες προγραμματισμού, καθώς εμφανίζεται ως μια ενιαία τιμή και όχι ως ένας συγκεκριμένος αριθμός πεδίων που καταλαμβάνουν χώρο. Επιπλέον, ο χρόνος UNIX συμμορφώνεται πλήρως με το πρότυπο UTC (συμπεριλαμβανομένων των δίσεκτων ετών) - σε αυτήν την περίπτωση, οι αντίστοιχες δεύτερες τιμές απλώς επαναλαμβάνονται.

Ορολογία Unix

Λίγα λόγια για τους όρους.

Ετσι, Χρόνος Unix(ή ώρα POSIX) είναι ο αριθμός των δευτερολέπτων που έχουν περάσει από τα μεσάνυχτα της 1ης Ιανουαρίου 1970 μέχρι σήμερα.

Unix Timestamp(χρονοσήμανση) είναι μια «σταθερή» ώρα, με άλλα λόγια, μια συγκεκριμένη ημερομηνία αποτυπωμένη σε έναν αριθμό.

UTC(Παγκόσμια Συντονισμένη Ώρα) είναι η Συντονισμένη Παγκόσμια Ώρα, η οποία είναι «σταθερή» στον πρώτο μεσημβρινό και από την οποία υπολογίζονται οι γεωγραφικές ζώνες ώρας.

Πόσο «ανθεκτικό» είναι αυτό το σύστημα;

Σε μερικές μόλις δεκαετίες, συγκεκριμένα στις 19 Ιανουαρίου 2038 στις 03:14:08 UTC, η ώρα Unix θα φτάσει την τιμή 2147483648 και τα συστήματα υπολογιστών μπορούν να ερμηνεύσουν αυτόν τον αριθμό ως αρνητικό. Το κλειδί για την επίλυση αυτού του προβλήματος είναι να χρησιμοποιήσετε μια μεταβλητή 64-bit (αντί για 32-bit) για την αποθήκευση του χρόνου. Σε αυτή την περίπτωση, η παροχή αριθμητικών τιμών του χρόνου Unix θα διαρκέσει την ανθρωπότητα για άλλα 292 δισεκατομμύρια χρόνια. Δεν είναι κακό, σωστά;

Ο χρόνος Unix είναι ένας για όλους

Εάν ζείτε στο Λονδίνο ή το Σαν Φρανσίσκο και οι φίλοι σας ζουν στη Μόσχα, τότε μπορείτε να «ελέγχετε τα ρολόγια σας» χρησιμοποιώντας την ώρα Unix: αυτό το σύστημα είναι επί του παρόντος το ίδιο για ολόκληρο τον κόσμο. Φυσικά, εάν η ώρα στους διακομιστές έχει ρυθμιστεί σωστά. Και με τη βοήθεια ενός εργαλείου "Μετατροπέας Unixtime"Αυτή η μετατροπή θα σας πάρει ένα κλάσμα του δευτερολέπτου.

Επειδή Δεν υπάρχουν ενσωματωμένα εργαλεία στο καύσιμο ντίζελ, δημιουργούμε την ακόλουθη δέσμη ενεργειών: #!/bin/sh truss date 2>&1 |grep ^time |awk "(print $3;)" exit $? ή nawk "BEGIN(print srand())" ή σε Perl: perl -e "print time, "\n";" μάθετε την ημερομηνία τροποποίησης του αρχείου: truss -v lstat -t lstat ls -l file.txt 2>&1 1>/dev/null | grep "mt\ =\ " | awk "(εκτύπωση $9;)"

Πώς να αποκτήσετε χρόνο Unix σε...

Perl χρόνος
PHP χρόνος()
Ρουμπίνι Time.now (ή Time.new). Για έξοδο: Time.now.to_i
Πύθων Πρώτα εισαγωγή χρόνου και μετά time.time()
Ιάβα long epoch = System.currentTimeMillis()/1000;
Microsoft .NET C# epoch = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
VBScript/ASP DateDiff("s", "01/01/1970 00:00:00", Τώρα())
Erlang calendar:datetime_to_gregorian_seconds(calendar:now_to_universal_time(now()))-719528*24*3600.
MySQL SELECT unix_timestamp(τώρα())
PostgreSQL SELECT απόσπασμα(εποχή ΑΠΟ τώρα());
SQL Server SELECT DATEDIFF(s, "1970-01-01 00:00:00", GETUTCDATE())
JavaScript Math.round(new Date().getTime()/1000.0) getTime() επιστρέφει την ώρα σε χιλιοστά του δευτερολέπτου.
Unix/Linux ημερομηνία +%s
Άλλα ΛΣ Γραμμή εντολών: perl -e "χρόνος εκτύπωσης" (Εάν το Perl είναι εγκατεστημένο στο σύστημά σας)

Μετατροπή ημερομηνίας σε ώρα Unix σε...
PHP mktime( παρακολουθώ, λεπτά, δευτερόλεπτα, μήνας, ημέρα, έτος)
Ρουμπίνι Time.local( έτος, μήνας, ημέρα, παρακολουθώ, λεπτά, δευτερόλεπτα, χρήσηc) (ή Time.gm για έξοδο GMT/UTC). Για έξοδο add.to_i
Πύθων πρώτα εισαγωγή χρόνου και μετά int(time.mktime(time.strptime("2000-01-01 12:34:00", "%Y-%m-%d %H:%M:%S")))
Ιάβα long epoch = new java.text.SimpleDateFormat("ηη/ΜΜ/εεεε ΩΩ:λλ:δδ").parse("01/01/1970 01:00:00");
VBScript/ASP DateDiff("s", "01/01/1970 00:00:00", πεδίο ημερομηνίας)
MySQL SELECT unix_timestamp( χρόνος) Μορφή ώρας: ΕΕΕΕ-ΜΜ-ΗΗ ΩΩ:ΜΛ:ΔΔ ή ΕΕΕΜΗΗ ή ΕΕΕΕΜΗΗ
PostgreSQL SELECT απόσπασμα(εποχή FROM ημερομηνία("2000-01-01 12:34"));
Με χρονική σήμανση: SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE "2001-02-16 20:38:40-08"); Με διάστημα: SELECT EXTRACT(EPOCH FROM INTERVAL "5 ημέρες 3 ώρες");
SQL Server SELECT DATEDIFF(s, "1970-01-01 00:00:00", πεδίο ημερομηνίας)
Unix/Linux ημερομηνία +%s -d"1 Ιανουαρίου 1980 00:00:01"

Μετατροπή χρόνων Unix σε αναγνώσιμες από τον άνθρωπο ημερομηνίες...
PHP ημερομηνία( Μορφή, χρόνο unix);
Ρουμπίνι Time.at( χρόνο unix)
Πύθων πρώτα εισαγωγή χρόνου, μετά time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.localtime( χρόνο unix)) Αντικαταστήστε το time.localtime με time.gmtime για την ημερομηνία GMT.
Ιάβα Ημερομηνία συμβολοσειράς = new java.text.SimpleDateFormat("ηη/ΜΜ/εεεε ΩΩ:λλ:δδ").format(new java.util.Date ( χρόνο unix*1000));
VBScript/ASP DateAdd("s", χρόνο unix, "01/01/1970 00:00:00")
PostgreSQL ΕΠΙΛΕΞΤΕ ΧΡΟΝΟΣΗΜΑ ΜΕ "εποχή" + ΖΩΝΗΣ ΩΡΑΣ χρόνο unix* ΔΙΑΣΤΗΜΑ "1 δευτερόλεπτο";
MySQL from_unixtime( χρόνο unix, προαιρετική, μορφή εξόδου) Τυπική μορφή εξόδου ΕΕΕ-ΜΜ-ΗΗ ΩΩ:ΜΛ:ΔΔ
SQL Server DATEADD(s, χρόνο unix, "1970-01-01 00:00:00")
Microsoft Excel =(A1 / 86400) + 25569 Το αποτέλεσμα θα είναι στη ζώνη ώρας GMT. Για άλλες ζώνες ώρας: =((A1 +/- διαφορά ώρας για τη ζώνη) / 86400) + 25569.
Linux ημερομηνία -d @1190000000
Άλλα ΛΣ Γραμμή εντολών: perl -e "print scalar(localtime( χρόνο unix))" (Εάν είναι εγκατεστημένο το Perl) Αντικαταστήστε το "localtime" με το "gmtime" για τη ζώνη ώρας GMT/UTC.
Η ώρα UNIX ή η ώρα POSIX είναι μια βολική μέθοδος κωδικοποίησης χρόνου που υιοθετείται ως η κύρια στο UNIX και σε άλλα συμβατά με POSIX λειτουργικά συστήματα.
Ο ίδιος ο χρόνος καταγράφεται σε δευτερόλεπτα που έχουν περάσει από την αρχή της Εποχής του Unix, που ξεκίνησε τα μεσάνυχτα (UTC) από τις 31 Δεκεμβρίου 1969 έως την 1η Ιανουαρίου 1970. Ο χρόνος Unix είναι συνεπής με το UTC, ιδιαίτερα όταν δηλώνεται UTC δίσεκτα δευτερόλεπτα - οι αντίστοιχοι αριθμοί δευτερολέπτων επαναλαμβάνονται.

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

Λήψη UnixTime σε διαφορετικά περιβάλλοντα:

Perlχρόνος
PHPχρόνος()
ΡουμπίνιTime.now (ή Time.new). Για έξοδο: Time.now.to_i
ΠύθωνΠρώτα εισαγωγή χρόνου και μετά time.time()
Ιάβαlong epoch = System.currentTimeMillis()/1000;
Microsoft .NET C#epoch = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
VBScript/ASPDateDiff("s", "01/01/1970 00:00:00", Τώρα())
Erlangcalendar:datetime_to_gregorian_seconds(calendar:now_to_universal_time(now()))-719528*24*3600.
MySQLSELECT unix_timestamp(τώρα())
PostgreSQLSELECT απόσπασμα(εποχή ΑΠΟ τώρα());
SQL ServerSELECT DATEDIFF(s, "1970-01-01 00:00:00", GETUTCDATE())
JavaScriptMath.round(new Date().getTime()/1000.0) getTime() επιστρέφει την ώρα σε χιλιοστά του δευτερολέπτου.
Unix/Linuxημερομηνία +%s
Άλλα ΛΣΓραμμή εντολών: perl -e "χρόνος εκτύπωσης" (Εάν το Perl είναι εγκατεστημένο στο σύστημά σας)

Πώς να μετατρέψετε την κανονική ημερομηνία σε UnixTime;

PHPmktime( παρακολουθώ, λεπτά, δευτερόλεπτα, μήνας, ημέρα, έτος)
ΡουμπίνιTime.local( έτος, μήνας, ημέρα, παρακολουθώ, λεπτά, δευτερόλεπτα, χρήσηc) (ή Time.gm για έξοδο GMT/UTC). Για έξοδο add.to_i
Πύθωνπρώτα εισαγωγή χρόνου και μετά int(time.mktime(time.strptime("2000-01-01 12:34:00", "%Y-%m-%d %H:%M:%S")))
Ιάβαlong epoch = new java.text.SimpleDateFormat("ηη/ΜΜ/εεεε ΩΩ:λλ:δδ").parse("01/01/1970 01:00:00");
VBScript/ASPDateDiff("s", "01/01/1970 00:00:00", πεδίο ημερομηνίας)
MySQLSELECT unix_timestamp( χρόνος) Μορφή ώρας: ΕΕΕΕ-ΜΜ-ΗΗ ΩΩ:ΜΛ:ΔΔ ή ΕΕΕΜΗΗ ή ΕΕΕΕΜΗΗ
PostgreSQLSELECT απόσπασμα(εποχή FROM ημερομηνία("2000-01-01 12:34"));
Με χρονική σήμανση: SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE "2001-02-16 20:38:40-08");Με διάστημα: SELECT EXTRACT(EPOCH FROM INTERVAL "5 ημέρες 3 ώρες");
SQL ServerSELECT DATEDIFF(s, "1970-01-01 00:00:00", πεδίο ημερομηνίας)
Unix/Linuxημερομηνία +%s -d"1 Ιανουαρίου 1980 00:00:01"

Ας μετατρέψουμε τα δευτερόλεπτα UnixTime σε μια ξεκάθαρη, αναγνώσιμη από τον άνθρωπο ημερομηνία:

PHPημερομηνία( Μορφή, χρόνο unix);
ΡουμπίνιTime.at( χρόνο unix)
Πύθωνπρώτα εισαγωγή χρόνου, μετά time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.localtime( χρόνο unix)) Αντικαταστήστε το time.localtime με time.gmtime για την ημερομηνία GMT.
ΙάβαΗμερομηνία συμβολοσειράς = new java.text.SimpleDateFormat("ηη/ΜΜ/εεεε ΩΩ:λλ:δδ").format(new java.util.Date ( χρόνο unix*1000));
VBScript/ASPDateAdd("s", χρόνο unix, "01/01/1970 00:00:00")
PostgreSQLΕΠΙΛΕΞΤΕ ΧΡΟΝΟΣΗΜΑ ΜΕ "εποχή" + ΖΩΝΗΣ ΩΡΑΣ χρόνο unix* ΔΙΑΣΤΗΜΑ "1 δευτερόλεπτο";
MySQLfrom_unixtime( χρόνο unix, προαιρετική, μορφή εξόδου) Τυπική μορφή εξόδου ΕΕΕ-ΜΜ-ΗΗ ΩΩ:ΜΛ:ΔΔ
SQL ServerDATEADD(s, χρόνο unix, "1970-01-01 00:00:00")
Microsoft Excel=(A1 / 86400) + 25569 Το αποτέλεσμα θα είναι στη ζώνη ώρας GMT. Για άλλες ζώνες ώρας: =((A1 +/- διαφορά ώρας για τη ζώνη) / 86400) + 25569.
Linuxημερομηνία -d @1190000000
Άλλα ΛΣΓραμμή εντολών: perl -e "print scalar(localtime( χρόνο unix))" (Εάν είναι εγκατεστημένο το Perl) Αντικαταστήστε το "localtime" με το "gmtime" για τη ζώνη ώρας GMT/UTC.

Ως επί το πλείστον, οι πληροφορίες κλάπηκαν από:

Αυτό το εργαλείο είναι απαραίτητο για τη μετατροπή μιας ημερομηνίας από τη μορφή Unix TimeStamp σε μια αναγνώσιμη από τον άνθρωπο ημερομηνία και αντίστροφα.

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

Χρόνος Unix (ή TimeStamp, που μεταφράζεται στα ρωσικά σημαίνει «χρονοσήμανση» και έχει την ίδια σημασία)είναι ο αριθμός των δευτερολέπτων που έχουν περάσει από την 1η Ιανουαρίου 1970. Δηλαδή, το Unix TimeStamp τη στιγμή της 01/01/1970 00:00:00 ήταν ίσο με 0. Μετά από 2 λεπτά (120 δευτερόλεπτα), ο χρόνος Unix ήταν ήδη 120. Για παράδειγμα, μια μέρα αργότερα (01/02 /1970 00:00:00) ο χρόνος Unix ήταν ήδη ίσος με 86400, αφού έχουν περάσει 60*60*24=86400 δευτερόλεπτα. Τώρα το Unix Time Stamp είναι ήδη 1561815370 και ο αριθμός αυξάνεται διαρκώς, αφού τα δευτερόλεπτα τρέχουν συνεχώς.

Αλλά γιατί να το χρησιμοποιήσετε;Το θέμα είναι ότι το Unix TimeStamp είναι βολικό στη χρήση για την αποθήκευση και τον χειρισμό ημερομηνιών κατά τον προγραμματισμό. Δεν θα υπεισέλθω σε λεπτομέρειες, αλλά εν συντομία, ένας αριθμός είναι πολύ πιο βολικός για μέτρηση και σύγκριση από μια συμβολοσειρά με «αριστερούς» χαρακτήρες. Αυτός είναι ο λόγος για τον οποίο οι περισσότεροι προγραμματιστές χρησιμοποιούν Unix TimeStamp για να δουλέψουν με ημερομηνίες στα έργα τους και στη βάση δεδομένων βλέπουμε συχνά έναν πολύ μεγάλο αριθμό στο πεδίο «ημερομηνία», που δεν μοιάζει καθόλου με ημερομηνία.

Εδώ είναι που αυτό το εργαλείο είναι χρήσιμο. Με αυτό, μπορείτε εύκολα να μεταφράσετε αυτόν τον "μεγάλο αριθμό από τη βάση δεδομένων" σε μια ημερομηνία αναγνώσιμη από τον άνθρωπο. Επιπλέον, μπορείτε να κάνετε το αντίθετο και να μετατρέψετε οποιαδήποτε ημερομηνία σε Unix TimeStamp. Αυτές είναι οι δυνατότητες με τις οποίες είναι προικισμένος αυτός ο μετατροπέας.

Πρόβλημα του 2038

Όπως είπα ήδη, ο αριθμός Unix TimeStampμε κάθε δευτερόλεπτο αυξάνεται κατά 1. Αργά ή γρήγορα πρέπει να έρθει το όριο αυτού του αριθμού και θα είναι το 2038. Το θέμα είναι ότι ο μέγιστος αριθμός στα λειτουργικά συστήματα 32-bit που ήταν κοινά στις αρχές του 21ου αιώνα είναι 2 31. Αυτός είναι ο αριθμός που θα φτάσει το Unix TimeStamp το 2038.

→ Έχει ήδη βρεθεί λύση σε αυτό το πρόβλημα. Για να διασφαλιστεί ότι οι ιστότοποι δεν θα σταματήσουν να παρακολουθούν σωστά τον χρόνο το 2038, αρκεί να χρησιμοποιήσετε ένα λειτουργικό σύστημα 64-bit στον φιλοξενούμενο/VDS/αποκλειστικό διακομιστή και όχι ένα λειτουργικό σύστημα 32-bit. Με την ραγδαία αυξανόμενη ισχύ των υπολογιστών και τη μείωση του κόστους τους, όλα οδεύουν προς το γεγονός ότι έως το 2038 η συντριπτική πλειονότητα των υπηρεσιών στον τομέα της παροχής χώρου για μια ιστοσελίδα θα παρέχεται με βάση 64-bit OS. Παρεμπιπτόντως, σε ένα σύστημα 64-bit, ένα τέτοιο πρόβλημα δεν θα μας επηρεάσει για τουλάχιστον 292 δισεκατομμύρια χρόνια, κάτι που αρκεί για να το εξετάσουμε πρόβλημα του 2038λυθεί.

mob_info