מחשבון גיל — גיל מדויק בשנים, חודשים וימים
מחשבון גיל חינמי: הזן את תאריך לידתך כדי לקבל את גילך המדויק בשנים, חודשים וימים, בנוסף לסך הכל שבועות, ימים, שעות ויום הולדתך הבא.
מחשבון גיל
נולדת ביום Monday
יום הולדת הבא: 127 ימים הרחק (חוגגת 37)
הגילך ביחידות אחרות
התקדמות חיים
הגילך מול טווח ייחוס של 80 שנה להמחשה.
תיעוד
מהו מחשבון גיל?
מחשבון גיל מוצא את פרק הזמן המדויק בין שני תאריכים: תאריך לידה ותאריך יעד, בדרך כלל היום. הוא מציג את התוצאה בשנים, בחודשים ובימים, וגם כסכום מצטבר בחודשים, בשבועות, בימים, בשעות, בדקות ובשניות. אפשר לחשב את הגיל גם עבור תאריך בעבר או בעתיד, וכך לראות בן כמה אדם היה או יהיה באותו יום.
כיצד מחשבים גיל
גיל הוא הפער בין שני תאריכים בלוח השנה. יש שתי דרכים נכונות לתאר את הפער הזה, ושתיהן שימושיות למטרות שונות.
גיל לפי לוח השנה (שנים, חודשים, ימים)
זו הדרך היומיומית שבה אנשים מציינים את גילם, למשל: "בן 33 שנים, 4 חודשים ו־5 ימים". החישוב נעשה בשלושה שלבים:
- סופרים את מספר השנים השלמות שעברו מאז תאריך הלידה.
- מיום ההולדת האחרון סופרים את מספר החודשים השלמים שעברו.
- משם סופרים את מספר הימים הנותרים.
שלב 3 נעשה מורכב לקראת סוף החודש, משום שלא בכל החודשים יש אותו מספר ימים. אדם שנולד ב־31 בינואר, וגילו נמדד ב־1 במרץ, הוא בן 1 חודש ו־1 יום. חודש אחד אחרי 31 בינואר מגיע 28 בפברואר (או 29 בפברואר בשנה מעוברת), משום שאין 31 בפברואר. 1 במרץ חל יום אחד לאחר מכן. שיטה זו, המכונה לעיתים כלל relativedelta על שם ספריית Python שהפכה אותה לנפוצה, מצמידה את תאריך יום השנה ליום האחרון בחודש הקצר יותר, כך שמספר הימים לעולם אינו שלילי.
סך הזמן שחלף (ימים, שעות, שניות)
כדי לחשב במדויק את הזמן שחי אדם, ממירים את שני התאריכים לנקודת זמן יחידה ומחשבים את ההפרש בימים שלמים:
כאשר d הוא מספר הימים השלמים, t הוא תאריך היעד ו-b הוא תאריך הלידה, וכל אחד מהם נלקח כמספר אלפיות השנייה, והמחלק הוא מספר אלפיות השנייה ביום אחד.
שני התאריכים נקבעים לחצות לפי UTC (זמן אוניברסלי מתואם) לפני החיסור. כך מונעים משינויים בשעון הקיץ להוסיף או לגרוע שעה ולעוות את ספירת הימים. מתוך מספר הימים, מספר השבועות הוא מספר הימים חלקי 7, בעיגול כלפי מטה. את מספר השעות, הדקות והשניות מקבלים על ידי הכפלת מספר הימים ב־24, 1,440 ו־86,400.
חלוקת מספר הימים הכולל ב־365 או ב־365.25 נותנת גיל משוער בשנים, אך אינה יודעת אילו שנים בטווח היו שנים מעוברות. ספירה לפי לוח השנה, שתוארה לעיל, היא מדויקת. יש להשתמש בגיל לפי לוח השנה כדי לענות על השאלה "בן כמה אני". יש להשתמש במספר הימים או השבועות הכולל במשימות הדורשות זמן שחלף מדויק, כגון תזמון מנות תרופה או ספירה לאחור עד לאירוע חשוב.
דוגמה פתורה
אדם שנולד ב־1 בינואר 2000, וגילו נמדד ב־1 בינואר 2020:
| מדד | ערך |
|---|---|
| גיל לפי לוח השנה | 20 שנים, 0 חודשים, 0 ימים |
| סך החודשים | 240 |
| סך השבועות | 1,043 |
| סך הימים | 7,305 |
| סך השעות | 175,320 |
| סך הדקות | 10,519,200 |
| סך השניות | 631,152,000 |
| היום בשבוע שבו נולד | שבת |
הסכום של 7,305 ימים שווה ל־20 × 365 ועוד 5 ימים מעוברים, עבור השנים המעוברות 2000, 2004, 2008, 2012 ו־2016. בכל אחת מהשנים האלה נוסף יום 29 בפברואר, הנכלל בטווח של 20 שנים. לכן מספר הימים גבוה יותר ממכפלה פשוטה של 20 × 365, ולכן קל לטעות בחישוב ידני בכמה ימים.
נוסחה לחישוב גיל בקוד
אפשר לממש את שיטת חישוב הגיל לפי לוח השנה ברוב שפות התכנות. שימוש בספריית תאריכים מובנית בטוח יותר מכתיבה ידנית של כללי השנים המעוברות ואורך החודשים.
1from dateutil.relativedelta import relativedelta
2from datetime import date
3
4birth, target = date(2000, 1, 1), date(2020, 1, 1)
5
6age = relativedelta(target, birth) # calendar age
7print(f"{age.years}y {age.months}m {age.days}d")
8
9total_days = (target - birth).days # total elapsed days
10print(total_days) # 7305
111const MS_PER_DAY = 86400000;
2
3// Add n months, clamping the day to the target month's last day
4// (31 January + 1 month = 28 February). Date.UTC on its own does not
5// clamp: it would roll that date forward into March.
6function addMonthsUTC(base, n) {
7 const total = base.getUTCMonth() + n;
8 const y = base.getUTCFullYear() + Math.floor(total / 12);
9 const m = ((total % 12) + 12) % 12;
10 const lastDay = new Date(Date.UTC(y, m + 1, 0)).getUTCDate();
11 return Date.UTC(y, m, Math.min(base.getUTCDate(), lastDay));
12}
13
14function calendarAge(birth, target) {
15 let months = (target.getUTCFullYear() - birth.getUTCFullYear()) * 12
16 + (target.getUTCMonth() - birth.getUTCMonth());
17 if (addMonthsUTC(birth, months) > target.getTime()) months -= 1;
18 const anchor = addMonthsUTC(birth, months);
19 return {
20 years: Math.floor(months / 12),
21 months: months % 12,
22 days: Math.floor((target.getTime() - anchor) / MS_PER_DAY),
23 };
24}
25
26const birth = new Date(Date.UTC(2000, 0, 1));
27const target = new Date(Date.UTC(2020, 0, 1));
28
29calendarAge(birth, target); // { years: 20, months: 0, days: 0 }
30Math.floor((target - birth) / MS_PER_DAY); // 7305
311' Whole days between two dates (A1 = birth, B1 = target):
2=B1-A1
3
4' Calendar age in complete years / months / leftover days:
5=DATEDIF(A1, B1, "y") & " years, " & DATEDIF(A1, B1, "ym") & " months, " & DATEDIF(A1, B1, "md") & " days"
6Microsoft מזהירה שהארגומנט "md" עלול להחזיר מספר שלילי או ספירת
ימים שגויה בסמוך לגבולות החודשים, ולכן חלק הימים הנותרים בנוסחה זו
לא תמיד תואם לכלל ההצמדה שתואר לעיל.
שאלות נפוצות
איך מוצאים את הגיל המדויק שלי? מזינים תאריך לידה ומשאירים את תאריך היעד על היום. התוצאה מציגה את הגיל בשנים, בחודשים ובימים, וכן את אותו גיל בסך הימים, השבועות, השעות והשניות.
מדוע שני מחשבוני גיל נותנים תשובות שונות? ההבדל נובע בדרך כלל מהאופן שבו סופרים את הימים הנותרים בסמוך לגבול של חודש. מחשבון שמצמיד את התאריך לחודש הקצר יותר בסוף החודש, כפי שתואר לעיל, עשוי להיות שונה ביום או ביומיים ממחשבון שפשוט מחלק את הזמן שחלף ב־30.
האם החישוב מביא בחשבון שנים מעוברות? כן. ספירת הימים הכוללת כוללת כל 29 בפברואר שנמצא בין שני התאריכים. בשנה שאין בה 29 בפברואר, יום הולדתו של מי שנולד ביום המעובר נחשב ל־28 בפברואר, היום האחרון באותו חודש. אדם שנולד ב־29 בפברואר 1996 הוא בן 26 שנים, 11 חודשים ו־22 ימים ב־20 בפברואר 2023, ויום ההולדת הבא שלו חל 8 ימים לאחר מכן, ב־28 בפברואר 2023.
האם אפשר לחשב גיל עבור תאריך בעבר או בעתיד? כן. הגדרת תאריך היעד לתאריך עתידי מראה בן כמה יהיה אדם באותו יום. הגדרת תאריך יעד בעבר מראה בן כמה היה. תאריך הלידה עצמו אינו יכול להיות בעתיד, ותאריך היעד אינו יכול להיות לפני תאריך הלידה.
האם אזורי זמן משפיעים על התוצאה? לא. שני התאריכים מומרים לחצות ב־UTC לפני ספירת הימים, ולכן התוצאה נשארת זהה ללא קשר למיקום המשתמש או לשינויים בשעון הקיץ.
מדוע ספירת הימים שונה מחלוקת הימים ב־365.25? 365.25 הוא רק אורך ממוצע של שנה; הוא אינו עוקב אחר השנים המסוימות בטווח שהן שנים מעוברות באורך 366 ימים. ספירת הימים השלמים בין שני תאריכים אמיתיים בלוח השנה היא מדויקת.
מקורות
- Python
dateutil—relativedelta, כלל החודשים והימים לחישוב גיל לפי לוח השנה שתואר לעיל. - פלטפורמת Java —
Period.betweenו־ChronoUnit.DAYS. - Microsoft Excel — פונקציית
DATEDIF. - תיעוד האינטרנט של MDN —
Date - Dershowitz, N., ו־Reingold, E. M. Calendrical Calculations: The Ultimate Edition. הוצאת אוניברסיטת קיימברידג', 2018.