لاحتساب الأيام التقويمية بين تاريخي نشر، قارن التاريخين في التقويم بدلًا من قسمة الساعات المنقضية على 24. على Mac، يتعامل Numbers مع المدخلات التي تقتصر على التاريخ؛ أما الطوابع الزمنية فيجب أولًا تفسيرها ضمن منطقة زمنية واحدة مختارة.
يستخدم هذا الدليل تواريخ نشر اصطناعية والتقويم الغريغوري. والمطلوب هو الإجابة عن السؤال: «كم يومًا تقويميًا يفصل بين هذين المنشورين؟» والاحتساب الافتراضي هو الفرق الموقّع: التاريخ نفسه يعطي صفرًا، والتاريخ التالي يعطي واحدًا.
ما نوع معلومات التاريخ المتوفرة لديك؟
اختر نوع المدخلات قبل إجراء الحساب. فالتاريخ المطبوع على منشور والطابع الزمني الذي يسجل لحظة نشره يتطلبان إعدادًا مختلفًا.
| المدخلات | المعنى | الإعداد |
|---|---|---|
2025-03-09 |
تاريخ تقويمي: السنة والشهر واليوم | قارنه مباشرةً بتاريخ تقويمي غريغوري آخر |
2025-03-09T05:00:00Z |
طابع زمني يحدد لحظة زمنية | حوّله إلى تاريخ ضمن منطقة الإبلاغ الزمنية التي اخترتها |
-05:00 |
إزاحة عن UTC | تصف فرق التوقيت المحلي عن UTC عند لحظة معينة |
America/New_York |
منطقة زمنية مسماة | توفر القواعد اللازمة لتفسير التواريخ المحلية وتغييرات الإزاحة |
تحمل الإزاحة والمنطقة المسماة معلومات مختلفة. فالإزاحة المرفقة بطابع زمني واحد لا تصف الإزاحة في تاريخ آخر. أما المنطقة المسماة فتوفر القواعد التي تحدد هذه العلاقة، بما فيها تغييرات التوقيت الصيفي. ويوضح ذلك صراحةً RFC 9557، «التاريخ والوقت على الإنترنت: طوابع زمنية بمعلومات إضافية».
في جدول بيانات لتواريخ النشر، اعتمد القاعدة التالية: احتفظ بالتواريخ المقدمة أصلًا بصفتها تواريخ تقويمية؛ واستخرج التواريخ من الطوابع الزمنية باستخدام منطقة إبلاغ مختارة صراحةً. لا تضف وقت منتصف الليل وإزاحة عشوائية إلى قيمة تقتصر على التاريخ لمجرد إجراء عملية طرح.
تميّز معايير التقويم أيضًا بين التواريخ والتواريخ والأوقات. يعرّف معيار iCalendar قيمة مستقلة DATE تتضمن مكونات التاريخ. ويستخدم شكلها المتسلسل أرقامًا بلا فواصل؛ أما التواريخ المكتوبة بشرطات في هذا الدليل فغرضها تسهيل القراءة. راجع RFC 5545، القسم 3.3.4.
لماذا لا تنجح قسمة الثواني المنقضية على 86,400؟
يقيس الفرق بين تاريخين تقويميين التقدم عبر التقويم. أما الفرق بين الزمنين المنقضيين فيقيس الفترة الفاصلة بين لحظتين. وعند الانتقال إلى التوقيت الصيفي أو الخروج منه، قد لا تتوافق الكميتان مع 24 ساعة لكل زيادة في التاريخ. ويشير RFC 5545 صراحةً إلى أن التكرار الاسمي ليوم واحد قد يستغرق أكثر أو أقل من 24 ساعة عند حدوث تغيير في المنطقة الزمنية. راجع مناقشته للتكرار.
انظر إلى زوجين اصطناعيين من تواريخ النشر في America/New_York. تستخدم الحسابات التالية منتصف الليل بالتوقيت المحلي عند كل طرف. وتتبع الإزاحات قواعد منطقة نيويورك والانتقال فيها الواردة في قاعدة بيانات المناطق الزمنية لدى IANA.
| فترة النشر الاصطناعية | إزاحة البداية | إزاحة النهاية | الساعات المنقضية | الفرق بين التاريخين التقويميين |
|---|---|---|---|---|
| 9–10 مارس 2025 | -05:00 |
-04:00 |
23 | 1 |
| 2–3 نوفمبر 2025 | -04:00 |
-05:00 |
25 | 1 |
بالنسبة إلى زوج مارس، اللحظتان المناظرتان بتوقيت UTC هما 2025-03-09T05:00:00Z و2025-03-10T04:00:00Z، أي تفصل بينهما 23 ساعة. وقسمة هذه الفترة على 24 تعطي نحو 0.9583. أما بالنسبة إلى زوج نوفمبر، فتعطي العملية المكافئة نحو 1.0417. ولا تجيب أي من القيمتين العشريتين عن السؤال التقويمي.
قد يخفي التقريب الخطأ في هذه الأمثلة، لكنه لا يوفر قاعدة احتساب موثوقة. فالمنشوران الصادران في 11:55 مساءً و12:05 صباحًا في تاريخين متتاليين لا يفصل بينهما سوى عشر دقائق، ومع ذلك يبلغ الفرق بينهما حسب التاريخ التقويمي واحدًا. استخرج التاريخين أولًا، ثم احسب الفرق بينهما.
كيف تحتسب تواريخ النشر في Numbers؟
استخدم هذه الطريقة عندما تكون تواريخ النشر المطلوبة متوفرة لديك بالفعل. توثّق Apple الدالة DAYS(end-date, start-date) على أنها تعيد عدد الأيام بين وسيطاتها، بما في ذلك نتيجة سالبة عندما يكون تاريخ النهاية أسبق من تاريخ البداية. راجع مرجع الدالة DAYS في Numbers.
افتح جدول بيانات في Numbers يتضمن جدولًا فارغًا. استخدم الصف الأول لعناوين وصفية، ثم أدخل الصيغ التالية كلًّا على حدة في الصف الثاني. لإدخال صيغة، حدد خليتها، واكتب = في بدايتها، وأكمل التعبير ثم اضغط على Return. هذه هي خطوات Apple الموثّقة لإدخال صيغة في Numbers على Mac.
| الخلية | عنوان العمود المقترح | الصيغة المراد إدخالها | القيمة المتوقعة |
|---|---|---|---|
A2 |
تاريخ النشر الأسبق | =DATE(2025,3,9) |
9 مارس 2025 |
B2 |
تاريخ النشر الأحدث | =DATE(2025,3,10) |
10 مارس 2025 |
C2 |
عدد الأيام التقويمية الفاصلة | =DAYS(B2,A2) |
1 |
إن استخدام DATE ينشئ المدخلات من السنة والشهر واليوم بدلًا من الاعتماد على طريقة تفسير سلسلة نصية ملتبسة. وتوصي Apple بهذه الدالة لضمان اتساق تفسير التاريخ مع إعدادات تنسيق التواريخ المختلفة في قائمة دوال التاريخ والوقت.
كرّر التحقق في الصف الثالث باستخدام =DATE(2025,11,2) في A3، و=DATE(2025,11,3) في B3، و=DAYS(B3,A3) في C3. وستكون الإجابة مجددًا 1. فأنت تقارن التواريخ التقويمية المقدمة، لذلك لا حاجة إلى تعديل الساعات المنقضية.
لإجراء حساب سريع دون خلايا مساعدة، أدخل =DAYS(DATE(2025,3,10),DATE(2025,3,9)) في خلية فارغة واحدة. ويسهل فحص نسخة الأعمدة المنفصلة وإعادة استخدامها مع أزواج متعددة من تواريخ النشر.
هل تريد الفاصل الزمني أم احتساب التواريخ شمولًا؟
لا يحتسب الفرق المعتاد تاريخ البداية كوحدة. فالفترة من 9 مارس إلى 10 مارس تفصلها يوم واحد. أما إذا كان المطلوب هو عدد مسميات التواريخ المشمولة من 9 مارس إلى 10 مارس، فالإجابة اثنان.
لنطاق شامل يكون تاريخ نهايته في تاريخ البداية نفسه أو بعده، استخدم =DAYS(B2,A2)+1. تحقق من الترتيب قبل تطبيق هذه الصيغة. فالفرق السالب دليل مفيد على احتمال عكس المدخلات؛ أما أخذ القيمة المطلقة تلقائيًا فيزيل هذه المعلومة.
ينطبق التمييز نفسه على نطاق من تاريخ واحد. فالفرق بين تاريخيه يساوي صفرًا، بينما يتضمن الاحتساب الشامل تاريخًا واحدًا. حدّد النتيجة التي يحتاج إليها جدول البيانات وسمِّ عمود النتيجة وفقًا لذلك.
ماذا لو كانت مدخلاتك طوابع زمنية؟
يجب تحويل الطابع الزمني إلى منطقة الإبلاغ الزمنية قبل حذف الوقت منه. فعلى سبيل المثال، يقابل 2025-03-10T00:30:00Z الساعة 8:30 مساءً يوم 9 مارس في America/New_York، باستخدام إزاحة -04:00 الخاصة بذلك التاريخ. ونسخ أول عشرة أحرف من الطابع الزمني سيحدد تاريخ UTC بدلًا من تاريخ النشر في نيويورك.
تقبل صيغة الدالة DAYS الموثّقة في Numbers وسيطتين من نوع التاريخ؛ ولا تتضمن وسيطة لمنطقة زمنية مسماة. استخدمها بعد تحديد التاريخين المقصودين. ولإجراء حساب متكرر للطوابع الزمنية على Mac، توفر Foundation واجهات برمجة التقويم اللازمة.
على الرغم من اسمها، تمثل Date في Foundation لحظة زمنية مستقلة عن أي تقويم أو منطقة زمنية. وتوجّه Apple إلى إجراء الحسابات التقويمية عبر Calendar. راجع وثائق Date الرسمية.
في حالات الانتقال العادية إلى التوقيت الصيفي أو الخروج منه، تتبع Foundation الخطوات التالية: اختر التقويم الغريغوري ومنطقة الإبلاغ الزمنية، وحدد بداية اليوم المحلي لكل طرف، ثم اطلب الفرق باستخدام مكوّن اليوم وحده. توثّق Apple كلًا من startOfDay(for:) وdateComponents(_:from:to:).
شغّل مثالًا كاملًا لـ Foundation في Terminal
تتطلب هذه الطريقة الاختيارية وجود سلسلة أدوات Swift مثبتة. افتح Terminal ونفّذ swift --version للتحقق، وفقًا لما يوضحه دليل البدء مع Swift. عند الحاجة، توثّق Apple تثبيت أدوات سطر الأوامر باستخدام xcode-select --install؛ أكمل مربع حوار التثبيت قبل المتابعة. راجع تثبيت أدوات سطر الأوامر.
الصق الكتلة الكاملة أدناه في Terminal. وهي تتضمن برنامجًا كاملًا وبيانات إدخال اصطناعية. يحلل البرنامج الطوابع الزمنية ذات الإزاحات الصريحة والثواني التي لا تتضمن أجزاء عشرية. وتوثّق Apple الخيار .withInternetDateTime لتنسيق الطابع الزمني هذا في مرجع خيارات ISO8601DateFormatter.
swift - <<'SWIFT'
import Foundation
let zoneID = "America/New_York"
guard let zone = TimeZone(identifier: zoneID) else {
fatalError("Unknown reporting zone: \(zoneID)")
}
var calendar = Calendar(identifier: .gregorian)
calendar.timeZone = zone
let parser = ISO8601DateFormatter()
parser.formatOptions = [.withInternetDateTime]
let samples = [
("Spring", "2025-03-09T00:00:00-05:00",
"2025-03-10T00:00:00-04:00"),
("Autumn", "2025-11-02T00:00:00-04:00",
"2025-11-03T00:00:00-05:00")
]
for (label, startText, endText) in samples {
guard let start = parser.date(from: startText),
let end = parser.date(from: endText) else {
fatalError("Could not parse timestamps for \(label)")
}
let startDay = calendar.startOfDay(for: start)
let endDay = calendar.startOfDay(for: end)
guard let days = calendar.dateComponents(
[.day], from: startDay, to: endDay
).day else {
fatalError("Could not calculate civil days for \(label)")
}
let hours = end.timeIntervalSince(start) / 3600
print("\(label): \(days) civil day(s), \(hours) elapsed hours")
}
SWIFT
فيما يلي الناتج المتوقع. تم التحقق من الأمثلة الرقمية بصورة مستقلة باستخدام حساب التاريخ؛ أما برنامج Swift فقد تمت مراجعته دون تشغيله على macOS هنا.
الربيع: يوم تقويمي واحد، 23.0 ساعة منقضية
الخريف: يوم تقويمي واحد، 25.0 ساعة منقضية
لتعديل البرنامج، استبدل سلاسل الطوابع الزمنية واختر منطقة الإبلاغ الزمنية بعناية. تحدد إزاحات الطوابع الزمنية اللحظات المقصودة؛ أما منطقة التقويم فتحدد التواريخ المحلية التي تقع فيها تلك اللحظات. ويتوقف البرنامج إذا أبلغ المحلل عن فشل، بدلًا من استخدام التاريخ الحالي أو تخطي سجل.
يقبل المثال التنسيق المحدد ذي الإزاحة. وتتطلب الثواني الكسرية خيارات محلل مختلفة. كما أنه لا ينفذ تعليقات المنطقة بين أقواس مربعة في RFC 9557؛ لذا مرّر المنطقة المسماة على نحو منفصل كما هو موضح، بدلًا من افتراض دعم إعداد المحلل لهذه التعليقات.
ما الذي ينبغي التحقق منه عندما تبدو النتيجة خاطئة؟
نفّذ عمليات التحقق التالية بالترتيب؛ إذ يعالج كل منها مصدرًا مختلفًا للاختلاف.
- تأكد من نوع الاحتساب المطلوب. يختلف الفرق بين تاريخين عن الاحتساب الشامل للتواريخ بمقدار واحد في النطاق المتقدم.
- تأكد من المدخلات. استخدم قيم السنة والشهر واليوم الفعلية للمنشورات التي تقتصر على التاريخ. ولا تفترض أن الطوابع الزمنية المستوردة تمثل التواريخ المحلية المقصودة بالفعل.
- تأكد من منطقة الإبلاغ الزمنية. حوّل اللحظتين باستخدام المنطقة المختارة نفسها قبل استخراج التاريخين.
- تأكد من العملية. احتسب الأيام التقويمية بعد استبعاد تأثير وقت اليوم. فقسمة الفترة بين لحظتين على
86,400تجيب عن سؤال يتعلق بالمدة المنقضية. - تأكد من الاتجاه. احتفظ بالنتيجة السالبة إلى أن تحدد ما إذا كان ترتيب المدخلين، الأسبق والأحدث، قد انعكس.
في التعليمات البرمجية التقويمية، استخدم واجهة بداية اليوم بدلًا من افتراض أن كل يوم محلي يبدأ بمنتصف ليل فريد. وتوثّق Apple أن startOfDay(for:) يختار منتصف الليل الأول عند وجود منتصفَي ليل، أو أول لحظة موجودة عند غياب منتصف الليل. وهذا يعالج حالة حدية قد لا يغطيها ضبط الساعة يدويًا على الصفر. راجع startOfDay(for:).
يتناول مثال Foundation تغييرات التوقيت الصيفي المعتادة. أما عند التعامل مع تغييرات تاريخية تتجاوز يومًا محليًا كاملًا، فحدّد أولًا ما إذا كانت المهمة تحتسب مسميات التواريخ الغريغورية أم الأيام المحلية التي وُجدت فعلًا؛ فهما مطلبان مختلفان. احتفظ بالمدخلات التي تقتصر على التاريخ بصفتها مسميات تقويمية عندما يكون المقصود هو الأول.
في جدول بيانات لتواريخ النشر، اجعل الحساب النهائي بسيطًا: حدّد التاريخين الغريغوريين المقصودين، واحتفظ بترتيبهما، واستخدم DAYS لإيجاد الفاصل بينهما. وعندما تكون المدخلات لحظات زمنية، حدّد منطقة الإبلاغ الزمنية صراحةً قبل الحساب. وهكذا تظل النتيجة مرتبطة بتواريخ النشر حتى عند تغيّر الساعة بينهما.
المصادر
DAYS — Apple.
احتساب القيم باستخدام البيانات في خلايا الجدول في Numbers على Mac — Apple.
قائمة الدوال حسب الفئة — Apple.
RFC 9557: التاريخ والوقت على الإنترنت: طوابع زمنية بمعلومات إضافية — IETF.
RFC 5545: مواصفات البنية الأساسية للتقويم والجدولة عبر الإنترنت (iCalendar) — محرر RFC.
Date — Apple.
startOfDay(for:) — Apple.
dateComponents(_:from:to:) — Apple.
formatOptions — Apple.
البدء — Swift.org.
تثبيت أدوات سطر الأوامر — Apple.