פיתוח · 3 דקות קריאה ·

חותמות זמן Unix: שניות או מילישניות?

הבאג של 13 הספרות שעולה לפרודקשן כל שבוע, וכלל פשוט להבחין בין שתי היחידות.

JavaScript מדברת במילישניות. רוב צד השרת מדבר בשניות. ערבבו ביניהן, והתאריכים ינחתו בינואר 1970 — או עשרות אלפי שנים בעתיד.

ספרו את הספרות

חותמת זמן עכשווית בשניות היא בת 10 ספרות (1790000000 הוא 21 בספטמבר 2026). אותו רגע במילישניות הוא בן 13 ספרות, במיקרו-שניות 16 ובננו-שניות 19.

הכלל

אם הערך המוחלט גדול מ-10¹², אלה מילישניות; אחרת, התייחסו אליו כשניות. הכלל נכון לכל חותמת במילישניות אחרי ספטמבר 2001 ולכל חותמת בשניות לפני השנה 33658.

const ms = Math.abs(n) > 1e12 ? n : n * 1000;

לחותמת זמן אין אזור זמן

חותמת זמן Unix סופרת שניות מאז 1 בינואר 1970 בשעה 00:00 UTC. אותו מספר הוא אותו רגע בכל מקום בעולם; רק אופן התצוגה משתנה. באגים מופיעים כשזמן מקומי מומר לחותמת זמן כאילו הוא UTC, וזה מזיז כל תאריך בהפרש של אזור הזמן שלכם, לרוב בשעה או שעתיים, ושוב סביב מעברי שעון קיץ. שמרו ושלחו חותמות זמן ב-UTC, והמירו לזמן מקומי רק כשאתם מציגים אותן לאדם.

קבלת הזמן הנוכחי בשפות נפוצות

JavaScript  Date.now()                        אלפיות שנייה
JavaScript  Math.floor(Date.now() / 1000)     שניות
Python      time.time()                       שניות (עם שבר)
Java        System.currentTimeMillis()        אלפיות שנייה
Go          time.Now().Unix()                 שניות
PostgreSQL  EXTRACT(EPOCH FROM now())         שניות
MySQL       UNIX_TIMESTAMP()                  שניות

תאריכים לפני 1970 ושנת 2038

חותמות זמן שליליות תקינות: ‎−86400 הוא 31 בדצמבר 1969. מערכות ישנות וגיליונות אלקטרוניים מסוימים לא מתמודדים איתן, ולכן תאריכי לידה ונתונים היסטוריים הם מקור נפוץ לבאגים. בקצה השני, מספר שלם של 32 ביט עם סימן נגמר ב-2147483647, שהוא 03:14:07 UTC ב-19 בינואר 2038. מערכות שעדיין שומרות חותמות זמן ב-32 ביט יתגלגלו ל-1901; אחסון של 64 ביט מונע את הבעיה למיליארדי שנים.

שניות מעוברות

זמן Unix מתעלם משניות מעוברות: כל יום הוא בדיוק 86,400 שניות. זה שומר על חשבון פשוט, וכמעט בכל יישום ההבדל לא משנה. רק מערכות שצריכות מרווחי זמן מדויקים לאורך שנייה מעוברת, כמו מערכות מדעיות או פיננסיות מסוימות, צריכות להתחשב בזה.

רשימת בדיקה מהירה לדיבוג

  • התאריך בינואר 1970: ערך בשניות נקרא כאלפיות שנייה.
  • השנה בעשרות אלפים: ערך באלפיות שנייה נקרא כשניות.
  • כל התאריכים זזים באותו מספר שעות: זמן מקומי טופל כ-UTC, או להפך.
  • תאריכים זזים בשעה אחת בחלק מהשנה: מעבר לשעון קיץ לא נלקח בחשבון.
  • התאריכים קופצים ל-1901: גלישה של 32 ביט.

בחרו את היחידה במפורש

ממיר חותמות הזמן של 4Dev לא מנחש: "Unix Timestamp" פירושו שניות ו-"Unix Timestamp (ms)" פירושו מילישניות, לצד גרסאות של מיקרו-שניות וננו-שניות — 33 פורמטים בסך הכול, כולל ISO 8601,‏ RFC 2822,‏ SQL DATETIME ותאריכים סידוריים של Excel.

ISO 8601 כשאנשים קוראים את התאריך

חותמות זמן מצוינות לאחסון ולחישובים, אבל קשה לאנשים לקרוא אותן. בלוגים, בממשקי API ובקבצים שאנשים פותחים, ISO 8601 כמו 2026-09-21T14:30:00Z הוא חד-משמעי, ממוין נכון כטקסט ומציין במפורש את אזור הזמן. המרה בין השניים היא בדיוק מה שממיר חותמות הזמן עושה.

לממיר חותמות הזמן

LinkedInXFacebook