Χρόνος

gmtime#

Μετατρέπει έναν χρόνο epoch σε αναλυτικό χρόνο UTC, είτε ως λίστα 9 στοιχείων είτε ως συμβολοσειρά τύπου ctime(3).

Η gmtime είναι η localtime εκφρασμένη στη ζώνη ώρας Greenwich. Παίρνει έναν ακέραιο αριθμό δευτερολέπτων από την epoch - τον τύπο τιμής που επιστρέφει η time - και επιστρέφει είτε τα επιμέρους ημερολογιακά πεδία (σε περιβάλλον λίστας) είτε μια έτοιμη προς εκτύπωση συνοπτική συμβολοσειρά (σε βαθμωτό περιβάλλον). Καμία αναζήτηση ζώνης ώρας, κανένα TZ, κανένα DST: το αποτέλεσμα είναι πάντοτε UTC.

Σύνοψη#

gmtime EXPR
gmtime

Η gmtime χωρίς όρισμα χρησιμοποιεί την τρέχουσα time.

Τι επιστρέφεται#

Σε περιβάλλον λίστας, μια λίστα εννέα στοιχείων που προέρχεται απευθείας από το C struct tm:

#    0     1     2      3      4     5      6      7      8
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst)
    = gmtime(time);

Δείκτης

Πεδίο

Εύρος

Σημειώσεις

0

$sec

0..60

το 60 επιτρέπει ένα θετικό leap second

1

$min

0..59

2

$hour

0..23

3

$mday

1..31

με αρχή το 1

4

$mon

0..11

με αρχή το 0 - ο Ιανουάριος είναι 0, ο Δεκέμβριος είναι 11

5

$year

έτη από το 1900 - προσθέστε 1900 για μ.Χ.

6

$wday

0..6

η Κυριακή είναι 0

7

$yday

0..365

0 είναι η 1η Ιανουαρίου· 365 μόνο σε δίσεκτα έτη

8

$isdst

0

πάντοτε 0 για την gmtime - το UTC δεν έχει DST

Σε βαθμωτό περιβάλλον, μία και μόνη αγγλική συμβολοσειρά μορφοποιημένη ως ctime(3):

my $s = gmtime;    # "Thu Oct 13 04:54:34 1994"

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

Καθολική κατάσταση που επηρεάζει#

Καμία. Η gmtime δεν διαβάζει το $ENV{TZ}, δεν συμβουλεύεται τις τοπικές ρυθμίσεις του διερμηνέα και δεν εξαρτάται ούτε τροποποιεί καμία από τις ειδικές μεταβλητές της Perl. Με το ίδιο EXPR, επιστρέφει πάντα το ίδιο αποτέλεσμα.

Χωρίς όρισμα, διαβάζει τον τρέχοντα πραγματικό χρόνο μέσω της time.

Παραδείγματα#

Τρέχον UTC αναλυμένο στα πεδία του, με τις παγίδες του 0-δείκτη μήνα και του έτους-από-1900 να αντιμετωπίζονται και οι δύο:

my @abbr = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
my ($sec, $min, $hour, $mday, $mon, $year) = gmtime;
printf "%s %d, %d  %02d:%02d:%02d UTC\n",
       $abbr[$mon], $mday, $year + 1900, $hour, $min, $sec;
# e.g. "Apr 23, 2026  14:07:09 UTC"

Η βαθμωτή μορφή - μία συμβολοσειρά σταθερής μορφής, χρήσιμη για αρχεία καταγραφής:

my $stamp = gmtime;
print "[$stamp] startup\n";
# "[Thu Apr 23 14:07:09 2026] startup"

Μορφοποιήστε τη λίστα με την POSIX::strftime όταν θέλετε ISO-8601 ή απόδοση με επίγνωση τοπικών ρυθμίσεων:

use POSIX qw(strftime);
my $iso = strftime "%Y-%m-%dT%H:%M:%SZ", gmtime;
# e.g. "2026-04-23T14:07:09Z"

Μετατρέψτε μια αποθηκευμένη epoch (όχι τον τρέχοντα χρόνο) - οποιαδήποτε ακέραια δευτερόλεπτα από την 1970-01-01 UTC λειτουργούν:

my $epoch = 1_700_000_000;
my @t = gmtime($epoch);
printf "%04d-%02d-%02d\n", $t[5] + 1900, $t[4] + 1, $t[3];
# "2023-11-14"

Το $isdst είναι πάντοτε 0 υπό την gmtime - μην το χρησιμοποιείτε για να ανιχνεύσετε το DST. Καλέστε την localtime αν χρειάζεστε αυτή την πληροφορία:

my $dst_here = (localtime)[8];   # 0 or 1 depending on local zone
my $dst_utc  = (gmtime)[8];      # always 0

Οριακές περιπτώσεις#

  • Η γυμνή κλήση χρησιμοποιεί τον τρέχοντα χρόνο: η gmtime χωρίς όρισμα ισούται με gmtime(time). Μέσα σε παρεμβολή ή σε λίστα που μπορεί να καταπιεί την κλήση, χρησιμοποιήστε παρενθέσεις: gmtime().

  • Το περιβάλλον λίστας έναντι βαθμωτού είναι φέρον. Σε περιβάλλον λίστας λαμβάνετε εννέα αριθμούς· σε βαθμωτό περιβάλλον λαμβάνετε μία συμβολοσειρά. Εξαναγκάζοντας βαθμωτό σε γυμνή κλήση μέσα σε λίστα:

    print gmtime, "\n";                # nine digits, no spaces
    print scalar gmtime, "\n";         # "Thu Apr 23 14:07:09 2026"
    
  • Το $mon έχει αρχή το 0, το $year μετράται από το 1900. Δύο από τα πιο κοινά σφάλματα της Perl. Για πλήρες ημερολογιακό έτος γράψτε $year + 1900· για μήνα με αρχή το 1 γράψτε $mon + 1.

  • Το $mday έχει αρχή το 1, το $yday έχει αρχή το 0. Αντικατοπτρίζει επακριβώς το C struct tm - ασυνεπές, αλλά σταθερό.

  • $sec == 60 σε θετικό leap second. Κώδικας που επικυρώνει με $sec <= 59 θα απορρίψει νόμιμες τιμές.

  • Αρνητικές τιμές epoch αναπαριστούν ημερομηνίες πριν από την 1970-01-01 UTC και γίνονται δεκτές σε πλατφόρμες των οποίων η gmtime(3) τις δέχεται - όπως το Linux. Η gmtime(-1) επιστρέφει 1969-12-31 23:59:59 UTC.

  • Τα κλασματικά δευτερόλεπτα απορρίπτονται. Η EXPR αποκόπτεται προς το μηδέν πριν από τη μετατροπή· το gmtime(1.9) ισούται με gmtime(1). Για υπο-δευτερολεπτική ακρίβεια, κρατήστε ξεχωριστά το δικό σας κλασματικό μέρος και μορφοποιήστε το χωριστά.

  • Καμία συντομογραφία ζώνης ώρας στη βαθμωτή μορφή. Σε αντίθεση με την έξοδο ctime(3) της localtime σε ορισμένες πλατφόρμες, η βαθμωτή μορφή της gmtime δεν περιλαμβάνει ποτέ όνομα ζώνης. Είναι πάντα η μορφή πέντε πεδίων "Wdy Mon DD HH:MM:SS YYYY".

  • Το $isdst είναι πάντοτε 0, όχι undef και όχι -1. Μην το ελέγχετε ως προς την αλήθεια υπό την gmtime· η απάντηση δεν έχει νόημα.

Εναλλακτικές και συμπληρωματικά#

  • Η αντίστροφη πορεία - από αναλυτικά πεδία πίσω σε epoch - είναι δουλειά του αρθρώματος Time::Local. Χρησιμοποιήστε εκεί την timegm (UTC) ή την timelocal (τοπική ζώνη):

    use Time::Local qw(timegm);
    my $epoch = timegm($sec, $min, $hour, $mday, $mon, $year);
    
  • Αντικειμενοστρεφή προσπέλαση βάσει ονόματος πεδίου προσφέρει το Time::Piece, που υπερφορτώνει τις localtime και gmtime ώστε να επιστρέφουν αντικείμενα με μεθόδους ->year, ->mon, ->mday κ.λπ. Οι συμβάσεις πεδίων εκεί έχουν προσαρμοστεί - το year είναι ήδη το πλήρες έτος, το mon είναι ήδη με αρχή το 1 - οπότε κώδικας γραμμένος για το Time::Piece δεν μπορεί να αναμιχθεί απερίσκεπτα με κώδικα γραμμένο για την ενσωματωμένη μορφή λίστας.

  • Η αναγνώσιμη από ανθρώπους μορφοποίηση ανήκει στην POSIX::strftime· τροφοδοτήστε την απευθείας με τη λίστα που επιστρέφει η gmtime.

  • Εκτενής αριθμητική ημερομηνιών, ζώνες ώρας, διάρκειες - καταφύγετε στο DateTime του CPAN. Η gmtime είναι το ελάχιστο βιώσιμο πρωτογενές δομικό στοιχείο· το DateTime είναι η πλήρης βιβλιοθήκη.

Διαφορές από το upstream#

Πλήρως συμβατό με το upstream Perl 5.42.

Δείτε επίσης#

  • localtime - η ίδια μετατροπή, αλλά στην τοπική ζώνη ώρας· εκεί το $isdst έχει νόημα

  • time - παράγει την τιμή epoch που καταναλώνει η gmtime

  • POSIX::strftime - μορφοποιήστε τη λίστα 9 στοιχείων σε αυθαίρετη συμβολοσειρά ημερομηνίας (ISO-8601, με επίγνωση τοπικών ρυθμίσεων κ.λπ.)

  • Time::Local - αντίστροφη πράξη: κατασκευάζει μια epoch από αναλυτικά πεδία UTC ή τοπικά

  • Time::Piece - αντικειμενοστρεφές περιτύλιγμα γύρω από τις gmtime / localtime με ονομασμένες μεθόδους προσπέλασης