עבור לתוכן
Alex Kovalev

אי-התאמת תאריכים באקסל ושגיאות off-by-one

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

1דקות קריאה

אי-התאמת תאריכים באקסל ושגיאות 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!

אתם יכולים לבדוק את הפורמט של התאריכים שלכם כאן:

B2=DATE(2025,9,21)
ABC1מספר סידורישיטת 1900שיטת 1904221 ספט׳‎ 202522 ספט׳‎ 20293Δ 1462 ימים · 4 שנים ויום4

אותו מספר, שני תאריכים, ארבע שנים ויום ביניהם. זה הבלבול של 1904. הטעות של יום אחד מסתתרת ב-60.

אותו תא, נקרא על ידי שתי חוברות עבודה. הזיזו אותו יום אחרי יום וראו איך שני הצדדים זזים יחד, ארבע שנים ויום זה מזה.

איך מתקנים את זה?

אלא אם אתם רוצים להחליף את הקורא, התיקון הכי מהיר הוא להתמודד עם ה-off-by-one ישירות. חלק מהקוראים יכולים לעבור בין מצב 1900 למצב 1904, אז תבדקו את זה קודם. כדי לראות מה אותו מספר אומר בכל אחת מהשיטות, הדביקו אותו בממיר תאריכי ה-Excel.

ועוד יותר טוב: לצאת מאקסל אם אפשר. CSV עושה ניסים: זה טקסט פשוט, אין בו epoch להתווכח עליו, והוא לא צריך אף תלות אחת כדי לעבד אותו. אלא אם בצד השני יושב בנק: אז זה ASCII ברוחב קבוע.

תגובות

התגובות נשמרות ב-GitHub Discussions (דרך giscus), אז כדי להצטרף לשיחה צריך חשבון GitHub.

אצייץ לך כשיעלה פוסט חדש

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

מעדיפים קורא RSS? יש פיד RSS.

© Alex Kovalev. כל הזכויות שמורות. · מדיניות פרטיות