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 |
|
| 60 מאפשר שנייה מעוברת חיובית |
1 |
|
| |
2 |
|
| |
3 |
|
| 1-בסיס |
4 |
|
| 0-בסיס - ינואר הוא 0, דצמבר הוא 11 |
5 |
| שנים מאז 1900 - הוסיפו | |
6 |
|
| יום ראשון הוא 0 |
7 |
|
| 0 הוא 1 בינואר; 365 רק בשנים מעוברות |
8 |
|
| תמיד 0 עבור |
בהקשר סקלרי, מחרוזת אנגלית בודדת בפורמט 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 בעלי שם