אי-התאמת תאריכים באקסל ושגיאות off-by-one
הבנת שיטות ה-epoch של תאריכים באקסל, ואיך לתקן שגיאות היסט של תאריך ביום אחד בעת קריאת קבצי .xls ו-.xlsx במערכות שונות.

אי-התאמת תאריכים באקסל ושגיאות off-by-one
קבצי .xls או .xlsx שומרים ערכי תאריך כמספר הימים שחלפו מתחילת ה-epoch. אז מתי בעצם מתחיל ה-epoch? לאקסל יש שתי תשובות: 1900 ו-1904, תלוי בהגדרות שלכם. ההיסטוריה קצת ארוכה אבל אפשר לצלול לפרטים כאן.
למה ה-epoch של אקסל בכלל חשוב?
אם אתם מנסים לקרוא קובץ xls. מודרני עם קורא ישן יותר, זה עלול לגרום לתאריכים שלכם להיות מוזזים ב-4 שנים. חלק מהספריות בכלל מנסות לתקן את זה על ידי הוספת 4 שנים, אבל מפספסות את תיקון היום המעובר, ואיכשהו זה רק מחמיר את המצב.
דמיינו שאתם טוענים קובץ xls שממפה תאריך למכירות:
"21/09/2025" => 1 "22/09/2025" => 2 "23/09/2025" => 3 ...באמצעות פונקציה כמו זו:
function get_excel_date_by_date($date) {
$excel_arr = read_file('path_to_file');
foreach($excel_arr as $row) { if($row[0] === $formatted_date) return $row }
}אם יש לכם אי-התאמה בקריאה בתוך read_file, או אם אתם משתמשים בספרייה ישנה יותר (אצלי זו הייתה Spreadsheet_Excel_Reader ל-php 4!), תגיעו בדיוק להיסט של יום אחד בתאריכים. כלומר עבור הקריאה get_excel_date_by_date("21/09/2025") תקבלו 2!
אתם יכולים לבדוק את הפורמט של התאריכים שלכם כאן:

אותו מספר, שני תאריכים, ארבע שנים ויום ביניהם. זה הבלבול של 1904. הטעות של יום אחד מסתתרת ב-60.
איך מתקנים את זה?
אלא אם אתם רוצים להחליף את הקורא, התיקון הכי מהיר הוא להתמודד עם ה-off-by-one ישירות. חלק מהקוראים יכולים לעבור בין מצב 1900 למצב 1904, אז תבדקו את זה קודם. כדי לראות מה אותו מספר אומר בכל אחת מהשיטות, הדביקו אותו בממיר תאריכי ה-Excel.
ועוד יותר טוב: לצאת מאקסל אם אפשר. CSV עושה ניסים: זה טקסט פשוט, אין בו epoch להתווכח עליו, והוא לא צריך אף תלות אחת כדי לעבד אותו. אלא אם בצד השני יושב בנק: אז זה ASCII ברוחב קבוע.
תגובות
התגובות נשמרות ב-GitHub Discussions (דרך giscus), אז כדי להצטרף לשיחה צריך חשבון GitHub.