كيفية حساب الفرق بين التواريخ في C#: عدد الأيام

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

كم يوماً مضى؟ نحل المشكلة الأبدية في C#

\n\n

تخيل: أنت تكتب تطبيقاً لإدارة الإجازات، أو مخطط مهام، أو تريد ببساطة معرفة عدد الأيام المتبقية حتى العام الجديد. وهنا يطرح السؤال الكلاسيكي: «كيفية حساب الفرق بين تاريخين في C#؟». هذا الاستعلام هو من أكثر الاستعلامات شيوعاً على Stack Overflow، وليس من دون سبب. التعامل مع التواريخ هو أساس يجب أن يعرفه كل مطور.

\n\n

في هذه المقالة، لن نقدم إجابة جافة فقط. سنشرح كل شيء بأمثلة حية، ونظهر المخاطر الخفية، ونعلمك كيفية الحصول على عدد الأيام (وليس فقط) بين أي لحظتين زمنيتين. هيا بنا!

\n\n

أبسط طريقة: طرح تاريخ من آخر

\n\n

في C#، للتعامل مع التواريخ والوقت، توجد بنية قوية تسمى DateTime. السر الرئيسي هو أنه إذا طرحت كائن DateTime من آخر، فلن تحصل على رقم، بل على كائن خاص — TimeSpan. وهو الذي يخزن الفرق.

\n\n

مثال أساسي: الفرق بالأيام بين تاريخين محددين

\n\n

لنفترض أنك تريد معرفة عدد الأيام بين 1 مارس 2024 و10 مايو 2024.

\n\n
using System;\n\nclass Program\n{\n    static void Main()\n    {\n        // إنشاء تاريخين\n        DateTime startDate = new DateTime(2024, 3, 1);\n        DateTime endDate = new DateTime(2024, 5, 10);\n\n        // حساب الفرق\n        TimeSpan difference = endDate - startDate;\n\n        // الحصول على عدد الأيام الكاملة\n        int days = difference.Days;\n\n        Console.WriteLine($"الفرق بالأيام: {days}");\n        // الإخراج: الفرق بالأيام: 70\n    }\n}\n
\n\n

الأمر بسيط، أليس كذلك؟ العامل - مُعاد تعريفه لـ DateTime ويعيد TimeSpan. الخاصية .Days تعيد عدد الأيام الكاملة (بدون مراعاة الساعات والدقائق والثواني).

\n\n

حساب الفرق مع «اليوم»

\n\n

غالباً ما تحتاج إلى حساب عدد الأيام التي مضت منذ حدث معين حتى اللحظة الحالية. لهذا نستخدم DateTime.Now أو DateTime.Today.

\n\n
DateTime today = DateTime.Today; // التاريخ فقط، الوقت 00:00\nDateTime someDay = new DateTime(2025, 1, 1); // 1 يناير 2025\n\nTimeSpan diff = someDay - today;\n\nConsole.WriteLine($"الأيام المتبقية حتى العام الجديد: {diff.Days} يوم");\n
\n\n

لاحظ: DateTime.Today يعيد التاريخ الحالي مع ضبط الوقت على 00:00:00. هذا مناسب إذا لم تكن الساعات والدقائق مهمة.

\n\n

ماذا لو كنت بحاجة إلى أكثر من مجرد أيام؟

\n\n

بنية TimeSpan ليست فقط .Days. لديها خصائص مفيدة أخرى قد تحتاجها إذا قررت توسيع الوظائف.

\n\n
    \n
  • .Days — عدد الأيام الكاملة.
  • \n
  • .Hours — الساعات (من 0 إلى 23).
  • \n
  • .Minutes — الدقائق.
  • \n
  • .Seconds — الثواني.
  • \n
  • .TotalDays — إجمالي عدد الأيام كرقم عشري (مثلاً 70.5).
  • \n
  • .TotalHours — إجمالي عدد الساعات.
  • \n
\n\n

مثال مع TotalDays

\n\n

تخيل أن الفرق بين التاريخين هو 36 ساعة بالضبط. الخاصية .Days ستظهر 1 (لأنه يوم كامل و12 ساعة). أما .TotalDays فستظهر 1.5.

\n\n
DateTime start = new DateTime(2024, 1, 1, 0, 0, 0);\nDateTime end = new DateTime(2024, 1, 2, 12, 0, 0); // 1 يناير + يوم واحد و12 ساعة\n\nTimeSpan span = end - start;\n\nConsole.WriteLine($"الأيام (الكاملة): {span.Days}");       // 1\nConsole.WriteLine($"إجمالي الأيام: {span.TotalDays}");    // 1.5\n
\n\n

إذا كانت مهمتك هي معرفة عدد الأيام الكاملة فقط، استخدم .Days. إذا كنت بحاجة إلى قيمة دقيقة مع كسور، استخدم

المدونات

توصيات الكتب