זמן

gmtime#

ממיר זמן epoch לזמן UTC מפורק, או כרשימה בת 9 אלמנטים או כמחרוזת בסגנון ctime(3).

gmtime הוא localtime מבוטא באזור הזמן של גריניץ׳. הוא לוקח מספר שלם של שניות מאז ה־epoch - סוג הערך ש־time מחזיר - ומחזיר או את שדות הלוח השנה הבודדים (בהקשר רשימה) או מחרוזת סיכום מוכנה להדפסה (בהקשר סקלרי). אין איתור אזור זמן, אין TZ, אין DST: התוצאה היא תמיד UTC.

תקציר#

gmtime EXPR
gmtime

gmtime ללא ארגומנט משתמש ב־time הנוכחי.

מה מקבלים בחזרה#

בהקשר רשימה, רשימה בת תשעה אלמנטים שנשאבת ישירות מ־struct tm של C:

#    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 מאפשר שנייה מעוברת חיובית

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"

הצורה הסקלרית היא תמיד אנגלית ובלתי־תלויה ב־locale. למחרוזת מודעת locale או בעלת פורמט שונה, בנו אותה מצורת הרשימה עם POSIX::strftime.

מצב גלובלי שהוא נוגע בו#

אין. gmtime אינו קורא את $ENV{TZ}, אינו מתייעץ עם ה־locale של המפרש, ואינו תלוי או משנה אחד ממשתני ה־Perl המיוחדים. בהינתן אותו EXPR, הוא תמיד מחזיר את אותה תוצאה.

ללא ארגומנט, הוא קורא את זמן wall-clock הנוכחי דרך 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 או הצגה מודעת locale:

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. משקף את struct tm של C במדויק - לא־עקבי, אך יציב.

  • $sec == 60 בשנייה מעוברת חיובית. קוד המאמת עם $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, שעושה overload ל־localtime ול־gmtime כדי להחזיר עצמים עם ->year, ->mon, ->mday וכו׳. מוסכמות השדות שם מותאמות - year הוא כבר השנה המלאה, mon הוא כבר באינדקס־1 - ולכן קוד שנכתב נגד Time::Piece אינו יכול להתערבב בקלות עם קוד שנכתב נגד צורת הרשימה המובנית.

  • פירמוט קריא־בני־אדם שייך ל־POSIX::strftime; הזינו לו את הרשימה ש־gmtime מחזיר ישירות.

  • אריתמטיקת תאריכים מקיפה, אזורי זמן, משכים - פנו אל DateTime ב־CPAN. gmtime הוא הפרימיטיב המינימלי בר־קיימא; DateTime היא הספרייה המלאה.

הבדלים מהמקור#

תאימות מלאה עם Perl 5.42 המקורי.

ראו גם#

  • localtime - אותה המרה, אך באזור הזמן המקומי; $isdst שם משמעותי

  • time - מפיק את ערך ה־epoch ש־gmtime צורך

  • POSIX::strftime - פרמוט הרשימה בת 9 האלמנטים למחרוזת תאריך שרירותית (ISO-8601, מודע locale, וכו׳)

  • Time::Local - פעולה הופכית: בניית epoch משדות UTC או מקומיים מפורקים

  • Time::Piece - עוטף עצם סביב gmtime / localtime עם accessors בעלי שם