ממיר Unix timestamp
המרת חותמת זמן Unix לתאריך קריא בכל אזור זמן, ותאריך בחזרה ל-epoch.
מהי חותמת זמן Unix
חותמת זמן Unix — שנקראת גם זמן epoch או זמן POSIX — היא מספר יחיד שסופר כמה שניות עברו מאז 00:00:00 UTC ב-1 בינואר 1970, רגע המכונה ה-Unix epoch. מכיוון שמדובר במספר שלם אחד, בלי אזור זמן, בלי לוח שנה ובלי עיצוב, זהו הפורמט שמחשבים בוחרים בכל פעם שצריך לאחסן רגע בזמן, למיין אותו, להשוות אותו או לשלוח אותו ברשת. זה מה שעומד מאחורי העמודה "created_at" במסד הנתונים שלך, מאחורי ה-claims "iat" ו-"exp" ב-JWT, מאחורי ה-mtime של קובץ, ומאחורי חותמות הזמן כמעט בכל קובץ לוג שתקרא אי פעם.
המחיר הוא שמספר חשוף לא אומר דבר לבן אדם. 1716197600 הוא רגע תקין לחלוטין, אבל אי אפשר לדעת במבט אם מדובר ביום שלישי שעבר או בלפני שלוש שנים. התרגום הזה, לשני הכיוונים, הוא מה שהכלי הזה עושה.
שניות או מילישניות — העמימות שנושכת
המוסכמה המקורית של Unix סופרת שניות שלמות, וזה מה שמקבלים מ-date +%s במעטפת, מ-time() ב-PHP, ומ-time.time() בפייתון לאחר קיצוץ. ג׳אווהסקריפט, ג׳אווה ורבים אחרים סופרים מילישניות במקום: Date.now() מחזיר מספר גדול פי אלף. שניהם נקראים "חותמת זמן", והבלבול ביניהם הוא אחד מבאגי התאריכים הנפוצים ביותר שיש.
הכישלון שקט ולא רועש. קרא ערך במילישניות כשניות, והתאריך שלך ינחת עשרות אלפי שנים בעתיד; קרא ערך בשניות כמילישניות, והכול יתכווץ לינואר 1970. אף אחד מהם לא זורק שגיאה — פשוט מתקבל תאריך שגוי שנראה כמו תאריך אמיתי.
הכלי הזה מנחש לפי סדר הגודל של המספר, ואז אומר לך מה ניחש, ממש ליד התוצאה. שניות ה-epoch של היום הן בנות עשר ספרות והמילישניות של היום הן בנות שלוש-עשרה, ולכן הניחוש כמעט תמיד נכון — אבל "כמעט" אינו מספיק טוב עבור ערך שאתה עומד להדביק לדוח באג, ולכן הפרשנות תמיד גלויה ותמיד במרחק לחיצה אחת מהחלפה.
אזורי זמן, UTC ולמה "מקומי" הוא חמקמק
לחותמת זמן Unix אין אזור זמן. היא מזהה רגע, ואותו רגע עצמו הוא בו-זמנית 09:33 בלונדון, 11:33 בירושלים ו-18:33 בטוקיו. אזור זמן אינו חלק מהערך; הוא עדשה שדרכה מסתכלים על הערך.
לכן הכלי הזה מציג כמה עדשות בבת אחת. UTC הוא הייחוס הנייטרלי שכל שרת וכל לוג מסכימים עליו. הזמן המקומי שלך הוא מה שהמכשיר שלך עצמו מדווח, ומוצג עם שם האזור שלו (למשל Europe/Berlin) כדי שתמיד תדע איזו עדשה הפיקה אותו — הזיהוי מתבצע בדפדפן שלך, כך שמבקר בברלין רואה את שעון ברלין ומבקר בטוקיו רואה את שעון טוקיו. השורה השלישית היא כל אזור שתבחר ממסד הנתונים המלא של אזורי הזמן IANA, וזו השורה שתרצה כשאתה קורא לוג משרת שחי במקום אחר.
- UTC — הייחוס שכל המערכות מסכימות עליו, והדבר הנכון לאחסן ולתעד.
- מקומי — אותו רגע כפי שהמכשיר שלך רואה אותו, מסומן באזור שזוהה.
- אזור לבחירתך — לקריאת לוגים ומעקבים ממכונות במקומות אחרים.
- ISO 8601 — פורמט הטקסט לחילופי נתונים, למשל 2024-05-20T09:33:20.000Z.
- יחסי — "לפני 3 שעות", לתחושה מהירה של כמה הדבר עדכני.
ההיסטים מוצגים לצד כל זמן (+03:00, -04:00) משום שהם אינם קבועים: רוב האזורים זזים בשעה בשל שעון קיץ, כך שאותו אזור עצמו יכול להפיק היסטים שונים בתקופות שונות בשנה. תאריך סמוך למעבר הוא בדיוק המקום שבו חישוב ידני משתבש.
עבודה עם זמן epoch בפועל
לכל שפה ולכל מעטפת יש דרך משלהן להפיק ערכי epoch ולקרוא אותם. אלה כדאי לזכור:
date +%s # מעטפת: הזמן הנוכחי בשניות date -d @1716197600 # מעטפת (GNU): משניות בחזרה לתאריך Date.now() # ג׳אווהסקריפט: הזמן הנוכחי במילישניות new Date(1716197600 * 1000) # ג׳אווהסקריפט: משניות ל-Date time.time() # פייתון: שניות, כמספר עשרוני datetime.fromtimestamp(1716197600, tz=timezone.utc) SELECT EXTRACT(EPOCH FROM now()) -- PostgreSQL: שניות
כלל אצבע שחוסך את רוב הכאב סביב תאריכים: אחסן ושדר רגעים כ-UTC — או כמספר epoch שלם או כמחרוזת ISO 8601 — והמר לאזור מקומי רק ברגע האחרון, כשבאמת מציגים אותו למישהו. עיצוב מוקדם מדי הוא הדרך שבה באג של אזור זמן נאפה לתוך הנתונים שלך במקום להישאר בשכבת התצוגה.
עוד דבר שכדאי לדעת: מונה שניות מסוג 32 סיביות עם סימן נגמר ב-19 בינואר 2038, "בעיית שנת 2038". מערכות מודרניות משתמשות בערכי 64 סיביות והן בסדר, אבל התקנים משובצים ישנים ועמודות מסד נתונים מדור קודם הם בדיוק המקומות שבהם עוד אפשר להיתקל בה.
שאלות נפוצות
- איך הכלי יודע אם המספר שלי הוא בשניות או במילישניות?
- לפי סדר הגודל שלו: ערכים מתחת ל-1e11 בקירוב נקראים כשניות, וגדולים מהם כמילישניות. כיום זה מפריד היטב בין שניות בנות עשר ספרות למילישניות בנות שלוש-עשרה. הפרשנות מוצגת ליד התוצאה וניתן להחליף אותה בלחיצה אחת, כך שהניחוש לעולם אינו מוסתר ממך.
- איזה אזור זמן נחשב "מקומי"?
- האזור שהמכשיר שלך עצמו מדווח עליו, מזוהה בדפדפן שלך ומוצג בשמו כדי שלא יישאר ספק. זה האזור שלך, לא של האתר — מבקר בברלין רואה את שעון ברלין ומבקר בטוקיו רואה את שעון טוקיו.
- אפשר להמיר תאריך בחזרה לחותמת זמן?
- כן. אותו שדה מקבל את שני הכיוונים: הקלד מספר ותקבל תאריך, הקלד תאריך כמו 2024-05-20 או 2024-05-20T09:33:20Z ותקבל בחזרה את ערך ה-epoch. אין מצב שצריך להחליף.
- האם הוא מטפל בתאריכים לפני 1970?
- כן. חותמות זמן שלפני ה-epoch הן פשוט שליליות — -86400 הוא 31 בדצמבר 1969 — וערכים שליליים מתקבלים ומומרים כרגיל.
- למה חותמת הזמן שלי מציגה תאריך שונה ממה שציפיתי?
- כמעט תמיד מאחת משתי סיבות: הפרשנות של שניות/מילישניות אינה מה שהנחת (בדוק את התווית והחלף אותה), או שאתה משווה ערך UTC מול ציפייה בזמן מקומי. הכלי מציג את שתי השורות זו לצד זו כדי שתראה במה מדובר.
- מהי בעיית שנת 2038?
- מערכות שמאחסנות שניות epoch במספר שלם של 32 סיביות עם סימן עוברות גלישה ב-19 בינואר 2038 ומתהפכות למספר שלילי, מה שמניב תאריכים ב-1901. כל מה שמשתמש בערכי 64 סיביות — כלומר כמעט כל דבר מודרני — אינו מושפע, אבל מערכות משובצות מדור קודם ועמודות מסד נתונים ישנות עדיין עלולות להיות בסיכון.
- האם חותמת הזמן שאני מזין נשלחת לאנשהו?
- לא. הפירוש, ההמרה והעיצוב רצים כולם בדפדפן שלך באמצעות התמיכה המובנית של הפלטפורמה בתאריכים ובאזורי זמן. שום דבר שתקליד לא עוזב את המכשיר שלך.