ماشینحساب سن — سن دقیق بر حسب سال، ماه و روز
ماشینحساب سن رایگان: تاریخ تولد خود را وارد کنید تا سن دقیق خود را بر حسب سال، ماه و روز بهدست آورید، بهعلاوه کل هفته، روز، ساعت و تاریخ تولد بعدی.
ماشینحساب سن
شما در یک روز متولد شدهاید Monday
تولد بعدی: 144 روز باقیمانده (37 سالگی)
سن شما در واحدهای دیگر
پیشرفت زندگی
سن شما برابر با یک بازه مرجعی 80 ساله.
مستندات
این ماشینحساب چه کاری انجام میدهد
تاریخ تولد خود را وارد کنید و برنامه به دقت گفتهتان میکند دقیقاً شما چند ساله هستید — بر حسب سال، ماه و روز — به همان روشی که به صورت شفاهی میگویید («من 33 سال، 4 ماه و 5 روز دارم»). همچنین این سن را صرفاً بر حسب ماه، هفته، روز، ساعت، دقیقه و ثانیه نشان میدهد، روز هفتهای که متولد شدهاید و مدتزمان تا تولد بعدیتان را.
فیلد دوم را در امروز بگذارید تا سن فعلیتان بهدست آید، یا آن را به هر تاریخ گذشته یا آینده تغییر دهید تا سن خود را در آن تاریخ بیابید.
قاعدهای که سن را پیچیده میکند: ماهها و سالها تعداد روز ثابتی ندارند. فوریه 28 یا 29 روز دارد؛ سایر ماهها 30 یا 31 روز دارند. بنابراین «1 ماه» به معنی «همان شماره روز، یک ماه بعد» است — نه «30 روز.» این ماشینحساب این قانون تقویمی را دنبال میکند، به همیندلیل میتواند یک یا دو روز با ابزارهایی که فقط بر 30 یا 365 تقسیم میکنند، متفاوت باشد.
نحوه محاسبه سن شما
سن فاصله بین دو تاریخ است. دو روش صادقانه برای اندازهگیری این فاصله وجود دارد و این ابزار هر دو را نشان میدهد.
1. سن تقویمی (سال، ماه، روز). سالهای کامل را از تاریخ تولد بشمارید، سپس ماههای کامل، سپس روزهای باقیمانده:
- تعداد سالهای کامل از زمان تولد را بشمارید.
- از آخرین تاریخ تولد، ماههای کامل را بشمارید.
- از آنجا، روزهای باقیمانده را بشمارید.
قسمت ظریف این مرحله 3 است که نزدیک مرزهای ماه رخ میدهد. کسی که در 31 ژانویه متولد شدهاست، اندازهگیری شده در 1 مارس، 1 ماه و 1 روز سن دارد — زیرا «یک ماه بعد از 31 ژانویه» به 28/29 فوریه میرسد (31 فوریه وجود ندارد)، و 1 مارس یک روز بعد از آن است. این ماشینحساب به انتهای ماه کوتاهتر کمتر میکند، با قانون dateutil.relativedelta که به طور گسترده استفاده میشود، بنابراین تولدهای پایانیماه هرگز شمارش روز منفی را تولید نمیکنند.
2. کل زمان گذشته (روز، ساعت، ثانیه). برای اعداد «سن شما در واحدهای دیگر»، دو تاریخ به تعداد روزهای کامل تبدیل شده و بیرون کشیده میشود:
هر دو تاریخ ابتدا به UTC نیمهشب ثابت شدهاند، بنابراین تغییرات پسانداز ساعت تابستان نمیتوانند یک ساعت اضافه یا کم کنند و شمارش روز را خراب کنند. هفتهها روز ÷ 7 (گرد شده)؛ ساعت، دقیقه و ثانیهها شمارش روز مقیاسشده هستند.
چرا فقط روزها را بر 365 تقسیم نمیکنیم؟ زیرا شما تغییر خواهید دید. تقسیم 7,305 روز بر 365 نتیجه 20.01 سال میدهد؛ تقسیم بر 365.25 نتیجه 20.00 میدهد — اما هیچ کدام نمیدانند کدام سالها سال کبیسه بودند یا کدام ماهها واقعاً طی کردید. شمارش تقویمی دقیق است؛ تقسیم روز یک تقریب است. برای «چند ساله هستم؟» از سن تقویمی استفاده کنید، و برای کار دقیق زمان گذشته (زمان دارو، مدت پروژه، شمارشها) از کل روز/هفته استفاده کنید.
مثال کار شده
متولد شده 1 ژانویه 2000، اندازهگیری 1 ژانویه 2020:
| اندازهگیری | مقدار |
|---|---|
| سن تقویمی | 20 سال، 0 ماه، 0 روز |
| کل روز | 7,305 |
| کل هفته | 1,043 |
| روز متولد | شنبه |
7,305 روز = 20 × 365 + 5 روز کبیسه (2000، 2004، 2008، 2012، 2016). این یک جزئیات — پنج روز اضافی که اکثر مردم فراموش میکنند — دقیقاً دلیلی است که ماشینحساب بهتر از ریاضی ذهنی است.
سن در کد
همان محاسبه در هر زبان. برای سن تقویمی، یک کتابخانه تاریخ داخلی را ترجیح دهید بر حسابی دستی — آن قبلاً سالهای کبیسه و طول ماهها را میداند.
1' 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"
61from 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
111function calendarAge(birth, target) {
2 let months = (target.getUTCFullYear() - birth.getUTCFullYear()) * 12
3 + (target.getUTCMonth() - birth.getUTCMonth());
4 const anchor = new Date(Date.UTC(birth.getUTCFullYear(), birth.getUTCMonth() + months, birth.getUTCDate()));
5 if (anchor > target) months--;
6 return { years: Math.floor(months / 12), months: months % 12 };
7}
8
9const birth = new Date(Date.UTC(2000, 0, 1));
10const target = new Date(Date.UTC(2020, 0, 1));
11const totalDays = Math.floor((target - birth) / 86400000); // 7305
121import java.time.LocalDate;
2import java.time.Period;
3import java.time.temporal.ChronoUnit;
4
5LocalDate birth = LocalDate.of(2000, 1, 1);
6LocalDate target = LocalDate.of(2020, 1, 1);
7
8Period age = Period.between(birth, target); // 20y 0m 0d
9long totalDays = ChronoUnit.DAYS.between(birth, target); // 7305
101using System;
2
3var birth = new DateTime(2000, 1, 1);
4var target = new DateTime(2020, 1, 1);
5
6int years = target.Year - birth.Year;
7if (birth.AddYears(years) > target) years--; // not birthday yet
8long totalDays = (target - birth).Days; // 7305
91#include <chrono>
2using namespace std::chrono;
3
4// C++20 calendar types
5sys_days birth = year{2000}/1/1;
6sys_days target = year{2020}/1/1;
7
8auto total_days = (target - birth).count(); // 7305
9years_months_days ymd_diff{birth, target}; // year_month_day arithmetic
101package main
2
3import "time"
4
5func main() {
6 birth := time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)
7 target := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC)
8 totalDays := int(target.Sub(birth).Hours() / 24) // 7305
9 _ = totalDays
10}
111use chrono::{NaiveDate, Datelike};
2
3let birth = NaiveDate::from_ymd_opt(2000, 1, 1).unwrap();
4let target = NaiveDate::from_ymd_opt(2020, 1, 1).unwrap();
5
6let total_days = (target - birth).num_days(); // 7305
7let years = target.year() - birth.year(); // adjust if birthday not reached
81<?php
2$birth = new DateTime('2000-01-01');
3$target = new DateTime('2020-01-01');
4$diff = $birth->diff($target);
5
6echo "{$diff->y}y {$diff->m}m {$diff->d}d\n"; // 20y 0m 0d
7echo $diff->days; // 7305
81require 'date'
2
3birth = Date.new(2000, 1, 1)
4target = Date.new(2020, 1, 1)
5
6total_days = (target - birth).to_i # 7305
7years = target.year - birth.year
8years -= 1 if birth.next_year(years) > target
91birth <- as.Date("2000-01-01")
2target <- as.Date("2020-01-01")
3
4total_days <- as.integer(target - birth) # 7305
5سوالات متداول
چند ساله هستم؟ تاریخ تولد خود را وارد کنید و هدف را در امروز بگذارید. ماشینحساب سن شما را بر حسب سال، ماه و روز نشان میدهد، و آن را در کل روز، هفته، ساعت و ثانیه تکرار میکند.
چرا سن من با ماشینحساب دیگری متفاوت است؟ تقریباً همیشه باقیمانده ماه/روز. ابزارها در مورد نحوه شمارش روزهای بعد از آخرین ماه کامل در مرزهای ماه اختلاف نظر دارند. این یکی به ماه کوتاهتر کمتر میکند (نمرات relativedelta)؛ یک ابزاری که بر 30 تقسیم میکند، یک یا دو روز متفاوت خواهد بود.
آیا سالهای کبیسه و تولدهای 29 فوریه را مدیریت میکند؟ بله. شمارش روز شامل هر روز کبیسه در محدوده است، و تولد 29 فوریه در سالهای غیر کبیسه بدون سرریز در برابر 28 فوریه / 1 مارس اندازهگیری میشود.
آیا میتوانم سن را در تاریخ گذشته یا آینده محاسبه کنم؟ بله — فیلد «سن در تاریخ» را به هر تاریخی تنظیم کنید. تاریخ آینده به شما میگوید چند ساله خواهید بود؛ تاریخ گذشته، چند ساله بودید.
منطقه زمانی چطور است؟ تاریخها قبل از شمارش به UTC نرمالشدهاند، بنابراین کل روز پایدار است مهمنیست کجا هستید یا پسانداز ساعت تابستان تغییر کرده یا نه.
منابع
- Python
dateutil—relativedelta(قانون سن تقویمی ماه/روز که این ابزار دنبال میکند). - Java Platform —
Period.betweenوChronoUnit.DAYS. - Microsoft Excel —
DATEDIFfunction. - MDN Web Docs —
Date. - Dershowitz, N., & Reingold, E. M. Calendrical Calculations: The Ultimate Edition. Cambridge University Press, 2018.