Χρόνος

time#

Επιστρέφει τον τρέχοντα πραγματικό χρόνο ως ακέραιο αριθμό δευτερολέπτων από την epoch του συστήματος.

Η time είναι το σημείο εκκίνησης για κάθε άλλη λειτουργία ημερομηνίας και ώρας στην Perl. Διαβάζει το ρολόι του συστήματος και επιστρέφει έναν ακέραιο - το πλήθος των non-leap δευτερολέπτων από την epoch, που σε κάθε υποστηριζόμενη πλατφόρμα είναι 00:00:00 UTC, 1 January 1970 (Unix time). Το αποτέλεσμα είναι κατάλληλο για απευθείας τροφοδότηση στις gmtime ή localtime για ανάλυση σε ημερολογιακή ημερομηνία, ή για αφαίρεση δύο αναγνώσεων ώστε να μετρηθεί ο χρόνος που πέρασε.

Σύνοψη#

time

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

Ένας απλός ακέραιος: δευτερόλεπτα από το 1970-01-01 00:00:00 UTC, αποκομμένα (όχι στρογγυλοποιημένα) προς το μηδέν. Καμία ακρίβεια κάτω του δευτερολέπτου - δύο κλήσεις μέσα στο ίδιο δευτερόλεπτο επιστρέφουν την ίδια τιμή. Για ακρίβεια χιλιοστών ή εκατομμυριοστών δευτερολέπτου, χρησιμοποιήστε Time::HiRes::time.

Η time δεν παίρνει ορίσματα· το σκέτο όνομα είναι ολόκληρη η κλήση. Η γραφή time() είναι επίσης μια χαρά και μερικές φορές πιο σαφής δίπλα σε άλλες κλήσεις συνάρτησης.

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

Πρωτογενής ανάγνωση του ρολογιού:

my $now = time;
print "$now\n";                       # e.g. 1745424000

Αναγνώσιμη από άνθρωπο τοπική ημερομηνία και ώρα - η time συνδυάζεται με την localtime σε βαθμωτό περιβάλλον για μια μορφοποιημένη συμβολοσειρά:

print scalar localtime, "\n";         # Wed Apr 23 12:00:00 2026

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

my ($sec, $min, $hour, $mday, $mon, $year) = localtime time;
$year += 1900;
$mon  += 1;
printf "%04d-%02d-%02d %02d:%02d:%02d\n",
       $year, $mon, $mday, $hour, $min, $sec;

Μέτρηση χρόνου που πέρασε γύρω από ένα μπλοκ εργασίας - το ιδιωματικό χρονόμετρο ακέραιων δευτερολέπτων:

my $t0 = time;
do_work();
my $elapsed = time - $t0;
print "took ${elapsed}s\n";

UTC αντί για τοπική ώρα - τροφοδοτήστε τον ίδιο ακέραιο στην gmtime:

my @utc = gmtime time;                # same fields, UTC-based
print scalar gmtime, "\n";            # Wed Apr 23 10:00:00 2026

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

  • Καμία ανάλυση κάτω του δευτερολέπτου. Διαδοχικές κλήσεις στο ίδιο δευτερόλεπτο επιστρέφουν τον ίδιο ακέραιο, οπότε το time - $t0 για γρήγορη εργασία εκτυπώνει 0. Χρησιμοποιήστε Time::HiRes::time για ανάγνωση κινητής υποδιαστολής με ακρίβεια εκατομμυριοστών:

    use Time::HiRes qw(time);
    my $t0 = time;                      # now a float
    do_work();
    printf "%.6f s\n", time - $t0;
    
  • Leap seconds. Το επιστρεφόμενο πλήθος εξαιρεί τα leap seconds· είναι POSIX «δευτερόλεπτα από την epoch» όπως τα αναφέρει ο πυρήνας. Κώδικας που αφαιρεί δύο αναγνώσεις της time μετράει δευτερόλεπτα πραγματικού χρόνου που πέρασαν, όχι δευτερόλεπτα SI, διασχίζοντας ένα όριο leap-second.

  • Πλάτος ακεραίου. Η τιμή είναι προσημασμένος ακέραιος επαρκώς πλατύς για τρέχουσες και μακρόχρονα μελλοντικές χρονοσφραγίδες σε όλες τις υποστηριζόμενες πλατφόρμες (64-bit). Το πρόβλημα του 2038 δεν ισχύει εδώ.

  • Ζώνη ώρας. Η ίδια η time είναι αδιάφορη σε ζώνη ώρας - ο ακέραιος ονοματίζει μία μόνο στιγμή σε UTC. Οι ζώνες ώρας μπαίνουν στο παιχνίδι μόνο όταν μετατρέπετε μέσω localtime· η gmtime παραμένει σε UTC.

  • Μονοτονικότητα. Η time ακολουθεί το ρολόι του συστήματος. Αν το ρολόι μετατοπιστεί προς τα πίσω (ρύθμιση NTP, χειροκίνητη αλλαγή), μια μεταγενέστερη κλήση μπορεί να επιστρέψει μικρότερη τιμή από μια προγενέστερη. Για μετρήσεις που πέρασαν και δεν πρέπει να γυρνάνε πίσω, χρησιμοποιήστε μονότονο ρολόι μέσω Time::HiRes::clock_gettime(CLOCK_MONOTONIC).

  • Σε αριθμητική. Το time + 3600 είναι μία ώρα από τώρα· το time - 86400 είναι 24 ώρες πριν. Τροφοδοτήστε το αποτέλεσμα στην localtime ή gmtime για να το αποδώσετε.

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

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

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

  • gmtime - αναλύει μια τιμή της time σε ημερολογιακά πεδία UTC (ή μια μορφοποιημένη συμβολοσειρά σε βαθμωτό περιβάλλον)

  • localtime - το ίδιο, αλλά στην τοπική ζώνη ώρας· ο πιο συνηθισμένος συνεργάτης της time

  • sleep - παύση για ακέραιο αριθμό δευτερολέπτων· συνδυάζεται φυσικά με την time για αδρό χρονοπρογραμματισμό

  • alarm - προγραμματίζει ένα SIGALRM δεδομένα δευτερόλεπτα στο μέλλον

  • Time::HiRes::time - δευτερόλεπτα κινητής υποδιαστολής με ανάλυση εκατομμυριοστών όταν η ακρίβεια ακέραιου δευτερολέπτου δεν επαρκεί