ما هو حساب التاريخ؟
حساب التاريخ هو عملية إيجاد الفرق بين تاريخين في التقويم، أو إضافة مدة معينة إلى تاريخ محدد وطرحها منه. تتيح لك حاسبة التاريخ الإلكترونية تحديد العدد الدقيق للأيام والأسابيع والأشهر والسنوات بين أي تاريخين دون الحاجة إلى العدّ اليدوي. يظهر ذلك في تخطيط المشاريع وقانون العقود والمحاسبة المالية وتطوير البرمجيات.
يأتي تعقيد حساب التاريخ من البنية غير المنتظمة للتقويم الغريغوري. فالأشهر تحتوي على 28 أو 29 أو 30 أو 31 يوماً، والسنوات تحتوي على 365 أو 366 يوماً وفقاً لقواعد السنة الكبيسة. ويُنتج الطرح المباشر لأرقام الأيام نتائج خاطئة حين تمتد التواريخ عبر أشهر أو سنوات مختلفة. لذلك يجب أن تأخذ خوارزميات الفرق بين التواريخ الصحيحة هذه الحالات الاستثنائية بعين الاعتبار بمعالجة كل وحدة تقويمية على حدة.
تظهر العمليات الحسابية للتواريخ في سياقات برمجية عديدة: حساب انتهاء صلاحية التوكن، وجدولة الأحداث المتكررة، وحساب مواعيد نهاية SLA، أو قياس الوقت المنقضي بين إدخالات السجل. في سير عمل DevOps تبرز في نوافذ صلاحية الشهادات، ومدد تجميد النشر، وأطوال مناوبات الاستجابة. ورغم أن معظم لغات البرمجة توفر مكتبات للتعامل مع التواريخ، فإن حاسبة المتصفح تمنحك إجابات فورية للفحوصات السريعة دون الحاجة إلى كتابة كود أو تثبيت تبعيات أو فتح REPL.
لماذا تستخدم هذه الحاسبة؟
احصل على تفصيل فوري للوقت بين أي تاريخين، مع عرض النتائج في وحدات متعددة في آنٍ واحد. بلا صيغ ولا كود ولا حاجة لإنشاء حساب.
حالات استخدام حاسبة التاريخ
مرجع وحدات مدة التاريخ
تشمل حسابات الفرق بين التواريخ وحدات ذات أطوال متفاوتة. الأشهر والسنوات ليست مدداً ثابتة، وهذا هو السبب في أن قسمة إجمالي الأيام بسيطة قد تُنتج نتائج غير دقيقة. يسرد الجدول أدناه كل وحدة ونطاقها:
| الوحدة | ما يعادلها | ملاحظة |
|---|---|---|
| 1 year | 365 or 366 days | Depends on leap year |
| 1 month | 28–31 days | Varies by month |
| 1 week | 7 days | Fixed |
| 1 day | 24 hours | Fixed (ignoring DST transitions) |
| 1 hour | 3,600 seconds | Fixed |
| 1 minute | 60 seconds | Fixed |
تنسيقات التاريخ الشائعة
عند التعامل مع التواريخ برمجياً، يحدد التنسيق كيفية تحليل سلسلة التاريخ. استخدام تنسيق خاطئ يسبب أخطاء صامتة. ISO 8601 هو الخيار الأكثر أماناً لتبادل البيانات لأنه لا لبس فيه ويدعم المناطق الزمنية. يسرد الجدول أدناه التنسيقات الأكثر احتمالاً لمواجهتها:
| التنسيق | مثال | يُستخدم في |
|---|---|---|
| ISO 8601 | 2026-04-10T14:30:00Z | APIs, databases, logs |
| RFC 2822 | Fri, 10 Apr 2026 14:30:00 +0000 | Email headers, HTTP |
| Unix timestamp | 1775831400 | Epoch-based systems |
| US format | 04/10/2026 | User-facing (US locale) |
| European format | 10.04.2026 | User-facing (EU locale) |
| Short ISO | 2026-04-10 | HTML date inputs, SQL DATE |
أمثلة الكود: حساب الأيام بين تاريخين
أمثلة عملية لحساب الفرق بين تاريخين في JavaScript و Python و Go وسطر الأوامر. يوضح كل مقطع حساب إجمالي الأيام والتفصيل بالوحدات التقويمية حيث تدعمه اللغة.
// Calculate days between two dates
const start = new Date('2026-01-15')
const end = new Date('2026-04-10')
const diffMs = end.getTime() - start.getTime()
const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24))
console.log(diffDays) // → 85
// Get year, month, day breakdown
function dateDiff(a, b) {
let years = b.getFullYear() - a.getFullYear()
let months = b.getMonth() - a.getMonth()
let days = b.getDate() - a.getDate()
if (days < 0) {
months--
days += new Date(b.getFullYear(), b.getMonth(), 0).getDate()
}
if (months < 0) { years--; months += 12 }
return { years, months, days }
}
console.log(dateDiff(start, end)) // → { years: 0, months: 2, days: 26 }from datetime import date, timedelta
from dateutil.relativedelta import relativedelta
start = date(2026, 1, 15)
end = date(2026, 4, 10)
# Total days
diff = (end - start).days
print(diff) # → 85
# Year/month/day breakdown (requires python-dateutil)
rd = relativedelta(end, start)
print(f"{rd.years}y {rd.months}m {rd.days}d") # → 0y 2m 26d
# Add 90 days to a date
future = start + timedelta(days=90)
print(future) # → 2026-04-15package main
import (
"fmt"
"time"
)
func main() {
start := time.Date(2026, 1, 15, 0, 0, 0, 0, time.UTC)
end := time.Date(2026, 4, 10, 0, 0, 0, 0, time.UTC)
// Total duration
diff := end.Sub(start)
days := int(diff.Hours() / 24)
fmt.Println(days) // → 85
// Add 90 days
future := start.AddDate(0, 0, 90)
fmt.Println(future.Format("2006-01-02")) // → 2026-04-15
}# Days between two dates (GNU coreutils) echo $(( ($(date -d "2026-04-10" +%s) - $(date -d "2026-01-15" +%s)) / 86400 )) # → 85 # Add 90 days to a date (GNU date) date -d "2026-01-15 + 90 days" +%Y-%m-%d # → 2026-04-15 # macOS (BSD date) — add 90 days date -j -v+90d -f "%Y-%m-%d" "2026-01-15" +%Y-%m-%d # → 2026-04-15