مقدمة: لماذا العمل مع التواريخ والوقت في C# هو أساس لأي مطور
\nكل مطور C# عاجلاً أم آجلاً يواجه الحاجة لمعالجة التواريخ والوقت. سواء كان تسجيل الأحداث، حساب المواعيد في تطبيق الأعمال، أو مجرد عرض التاريخ الحالي على الشاشة - لا يمكن الاستغناء عن الإتقان في استخدام DateTime و TimeSpan. في هذه المقالة سنستعرض جميع الجوانب الرئيسية: من إنشاء الكائنات إلى العمل مع المناطق الزمنية والأداء. المحتوى مناسب للمبتدئين وكذلك للمبرمجين ذوي الخبرة الراغبين في تنظيم معارفهم.
الأنواع الأساسية للعمل مع التاريخ والوقت في .NET
\nفي .NET توجد عدة أنواع، كل منها يحل مشكلة معينة. دعنا نستعرض أهمها.
\n\nDateTime - الأساس
\nDateTime هو هيكل يمثل لحظة زمنية (التاريخ والوقت). يدعم نطاقاً من 01.01.0001 إلى 31.12.9999. يمكن إنشاء كائن بعدة طرق:
// التاريخ والوقت الحاليين\nDateTime now = DateTime.Now;\n// التاريخ والوقت الحاليين بالتوقيت العالمي (UTC)\nDateTime utcNow = DateTime.UtcNow;\n// تاريخ محدد\nDateTime specificDate = new DateTime(2025, 3, 15);\n// التاريخ والوقت بدقة حتى الثانية\nDateTime withTime = new DateTime(2025, 3, 15, 14, 30, 0);\n// تاريخ اليوم (الوقت 00:00:00)\nDateTime today = DateTime.Today;\n\nTimeSpan - الفترات الزمنية
\nTimeSpan يمثل فترة زمنية (الفرق بين تاريخين). وهو مناسب لحساب مدة العمليات:
// إنشاء فترة زمنية\nTimeSpan interval = new TimeSpan(2, 5, 30); // ساعتان، 5 دقائق، 30 ثانية\n// الفرق بين تاريخين\nDateTime start = DateTime.Now;\nSystem.Threading.Thread.Sleep(1000); // محاكاة عمل\nDateTime end = DateTime.Now;\nTimeSpan duration = end - start;\nConsole.WriteLine($"مرت {duration.TotalSeconds} ثانية");\n\nDateTimeOffset - التاريخ مع مراعاة المنطقة الزمنية
\nللتطبيقات الحديثة التي تعمل مع مستخدمين من مناطق مختلفة، يعتبر DateTimeOffset مهماً جداً. فهو يخزن التاريخ والوقت مع الإزاحة عن التوقيت العالمي (UTC):
// الوقت الحالي مع الإزاحة المحلية\nDateTimeOffset localOffset = DateTimeOffset.Now;\n// الوقت مع إزاحة محددة\nDateTimeOffset customOffset = new DateTimeOffset(2025, 3, 15, 12, 0, 0, TimeSpan.FromHours(3));\n// التحويل إلى UTC\nDateTime utc = localOffset.UtcDateTime;\n\nتنسيق وتحليل التواريخ
\nالعرض الصحيح للتواريخ للمستخدم وقراءة البيانات من النصوص هي مهارات ضرورية.
\n\nالتنسيق: ToString() والقوالب المخصصة
\nالطريقة ToString() تقبل سلسلة تنسيق. أشهر التنسيقات القياسية:
- \n
"d"— تاريخ قصير (15.03.2025) \n "D"— تاريخ كامل (15 مارس 2025) \n "t"— وقت قصير (14:30) \n "T"— وقت كامل (14:30:00) \n "g"— تنسيق عام تاريخ/وقت (15.03.2025 14:30) \n
أمثلة على التنسيق المخصص:
\nDateTime dt = new DateTime(2025, 3, 15, 14, 30, 45);\nConsole.WriteLine(dt.ToString("yyyy-MM-dd")); // 2025-03-15\nConsole.WriteLine(dt.ToString("dd.MM.yyyy HH:mm")); // 15.03.2025 14:30\nConsole.WriteLine(dt.ToString("dddd, MMMM yyyy")); // السبت, مارس 2025 (يعتمد على الثقافة)\n\nالتحليل: تحويل النص إلى تاريخ
\nللتحليل الموثوق استخدم DateTime.TryParse أو DateTime.ParseExact:
string dateString = "15.03.2025";\nif (DateTime.TryParse(dateString, out DateTime result))\n{\n Console.WriteLine($"نجاح: {result}");\n}\nelse\n{\n Console.WriteLine("خطأ في التحليل");\n}\n\n// تحليل دقيق مع تحديد التنسيق\nstring exactString = "2025-03-15 14:30:00";\nDateTime parsed = DateTime.ParseExact(exactString, "yyyy-MM-dd HH:mm