חותמות זמן Unix בלי כאב הראש
שאלו שלושה מפתחים מה השעה ותקבלו אולי שלוש תשובות, תלוי איפה הם יושבים. שאלו חותמת זמן Unix ותקבלו בדיוק מספר אחד, זהה לכולם על הכוכב. אותו מספר שלם בודד הוא הסיבה שזמן epoch תומך בשקט כמעט בכל קובץ לוג, שורת מסד נתונים, ותגובת API שתיתקלו בהם אי פעם. עמוד זה מסביר מה המספר הזה אומר, איך לקרוא אותו בשני הכיוונים, והיכן הוא נוטה להכשיל אנשים.

מהו זמן Unix בפועל
חותמת זמן Unix היא מספר השניות שחלפו מאז 00:00:00 UTC בתאריך 1 בינואר 1970, ללא ספירת שניות כבישה (leap seconds). אותו רגע נקרא ה-epoch, והוא נבחר על ידי מהנדסי Unix הראשונים פשוט משום שהיה תאריך עגול ונוח לספור ממנו. ברגע ה-epoch הערך הוא בדיוק 0. כל שנייה מאז מוסיפה אחת, כך שהמספר רק גדל. גם תאריכים שלפני 1970 תקינים לחלוטין, ומבוטאים כמספרים שלמים שליליים.
תיתקלו במושג הזה גם בשם POSIX time, או באופן לא רשמי, epoch time. יהיה התווית אשר תהיה, המכניקה זהה: מונה שניות שרק גדל. מכיוון שזהו מספר שלם פשוט ולא מחרוזת מעוצבת, מחשב יכול לאחסן אותו בכמה בתים בודדים ולהשוות בין שניים כאלה בחיסור בודד.
שניות, מילישניות, וחברותיהן
זמן Unix הקלאסי סופר שניות שלמות, מה שנותן את המספר המוכר בן עשר הספרות שאתם רואים היום. אבל סביבות רבות זקוקות לרזולוציה עדינה יותר. JavaScript, לדוגמה, עובד במילישניות, ומייצר ערך בן שלוש-עשרה ספרות, ומערכות מסוימות הולכות רחוק יותר לתוך מיקרושניות או ננושניות. כלל אצבע אמין: מספר בן עשר ספרות הוא שניות, שלוש-עשרה ספרות הן מילישניות. אם התאריך שהומר נוחת אי-שם סביב 1970 כשציפיתם להיום, כמעט בוודאות הזנתם מילישניות לשדה שניות, או להפך. הממיר שלנו מזהה אוטומטית את הסדר גודל כך שכמעט לעולם לא תצטרכו לנחש.
למה מפתחים נשענים עליו
היתרון הגדול הוא שחותמת זמן היא ניטרלית לאזור זמן. המספר השלם 1735689600 מתייחס לאותו הרגע בדיוק בטוקיו, בברלין, ובסאו פאולו. אחסון המספר הזה במקום מחרוזת מקומית מעוצבת אומר שלעולם לא תצטרכו לתהות לאיזה שעון ערך שייך. גם מיון טריוויאלי, כי סדר כרונולוגי הוא פשוט סדר מספרי, כך שאינדקס מסד נתונים על עמודת חותמת זמן ממיין אירועים נכון ללא צורך בפענוח. גם חשבון פשוט באותה מידה: הפער בין שני אירועים הוא חיסור בודד, והוספת יום אחד היא הוספת 86400. תכונות אלה הן בדיוק הסיבה שלוגים, טוקנים, מטמונים ותורי הודעות כולם פונים לזמן epoch.
המרה בשני הכיוונים
מעבר מחותמת זמן לתאריך קריא לבני אדם משמעו לקחת את מספר השניות ולהקרין אותו על לוח שנה, ואז לעצב זאת באזור הזמן שאכפת לכם ממנו. בכיוון ההפוך, לוקחים שנה, חודש, יום ושעה, מחליטים באיזה אזור זמן זה מבוטא, ומקפלים זאת בחזרה לשניות מאז ה-epoch. הכלי שלנו עושה את שני הכיוונים באופן מיידי וכולו בתוך הדפדפן שלכם, כך ששום דבר שאתם מדביקים לא עוזב את המכשיר שלכם. הדביקו מספר כדי לפענח אותו, או בחרו תאריך כדי לקודד אותו, וקראו את התוצאה גם ב-UTC וגם בזמן המקומי שלכם באותו רגע ממש.

UTC לעומת זמן מקומי, המלכודת הקלאסית
לחותמת הזמן עצמה אין אזור זמן; היא תמיד מעוגנת ב-UTC. הבלבול מופיע רק כשאתם מציגים אותה. אם תמירו את 1700000000 ומסך שלכם מציג שעת ערב בעוד עמית במדינה אחרת רואה שעת אחר צהריים, שום דבר לא שבור, שניכם פשוט מסתכלים על אותו הרגע המדויק, מוצג בשעונים מקומיים שונים. באגים מתגנבים כאשר קוד קורא תאריך מקומי כאילו הוא UTC, או מטביע שעת שעון קיר בלי לתעד את ההיסט. ההרגל הבטוח הוא לאחסן ולהעביר UTC, ולהחיל היסט מקומי רק ברגע האחרון ממש, כשאתם מציגים את הערך לבן אדם. במקרה של ספק, השוו מול השורה של UTC בממיר ולא מול השורה המקומית שלכם.
בעיית שנת 2038
מערכות ישנות רבות אחסנו זמן Unix במספר שלם חתום בן 32 סיביות. השדה הזה נגמר שנייה אחת אחרי 03:14:07 UTC ב-19 בינואר 2038, כאשר המונה גולש וחוזר לערך שלילי, ועלול להשליך תאריכים אחורה עד 1901. זו אותה משפחת בעיה כמו Y2K. הבשורה הטובה היא שמערכות הפעלה ושפות מודרניות עברו ברובן לחותמות זמן בנות 64 סיביות, שלא יגלשו במשך כ-292 מיליארד שנה, כך שעבור קוד חדש זה בעיקר קוריוז היסטורי שכדאי להכיר ולא מצב חירום.
לעוד עזרים מבוססי דפדפן ראו את כלי המפתחים שלנו, ואם אתם צריכים לעבד את המספרים עצמם, המחשבונים נמצאים במרחק קליק.
שאלות נפוצות
מהי חותמת זמן Unix?
זהו מספר השניות מאז 00:00:00 UTC ב-1 בינואר 1970, ללא ספירת שניות כבישה. אותו רגע התחלה נקרא ה-epoch, והספירה רק עולה עם הזמן.
למה המספר שלי מומר לתאריך שקרוב ל-1970?
כנראה בלבלתם בין שניות למילישניות. מספר בן עשר ספרות הוא שניות ומספר בן שלוש-עשרה ספרות הוא מילישניות. הזנת מילישניות לשדה שניות מחלקת את הזמן הנראה בכ-אלף, ומנחיתה אתכם קרוב ל-epoch.
האם לחותמת זמן Unix יש אזור זמן?
לא. הערך תמיד מעוגן ב-UTC. אזור זמן נכנס לתמונה רק כשאתם מציגים את חותמת הזמן כתאריך קריא לבני אדם, וזו הסיבה שאותו מספר יכול להציג שעות שעון קיר שונות לאנשים שונים.
איך ממירים תאריך בחזרה לחותמת זמן?
ספקו את השנה, החודש, היום והשעה, החליטו באיזה אזור זמן התאריך מבוטא, והכלי מקפל אותו לשניות מאז ה-epoch. תוכלו לבצע את שני הכיוונים בעמוד הזה באופן מיידי בתוך הדפדפן שלכם.
מהי בעיית שנת 2038?
מערכות שמאחסנות זמן Unix במספר שלם חתום בן 32 סיביות גולשות שנייה אחת אחרי 03:14:07 UTC ב-19 בינואר 2038. חותמות זמן מודרניות בנות 64 סיביות נמנעות מכך למשך מיליארדי שנים, כך שרוב התוכנה הנוכחית לא מושפעת.
האם הנתונים שלי נשלחים לשרת?
לא. ההמרה מתבצעת כולה בתוך הדפדפן שלכם, כך שכל חותמת זמן או תאריך שאתם מדביקים נשארים במכשיר שלכם בלבד.
