مقدمة في العمل مع التواريخ والوقت في C#
العمل مع التواريخ والوقت هو أحد المهام الأساسية في تطوير البرمجيات. سواء كان ذلك لتسجيل الأحداث، حساب المواعيد النهائية، إنشاء التقارير أو العمل مع قواعد البيانات - فإن القدرة على إدارة البيانات الزمنية بشكل صحيح أمر بالغ الأهمية. في C# (منصة .NET) توجد مجموعة قوية ومرنة من الأدوات لهذه الأغراض، تتضمن الهياكل DateTime و TimeSpan و DateTimeOffset.
في هذه المقالة، سنقوم بتحليل جميع الجوانب الرئيسية للعمل مع التواريخ والوقت في C# بالتفصيل. ستتعلم كيفية إنشاء البيانات الزمنية وتنسيقها ومقارنتها والتعامل معها، بالإضافة إلى التعرف على أفضل الممارسات التي ستساعدك على تجنب الأخطاء الشائعة.
الهياكل الأساسية: DateTime و TimeSpan و DateTimeOffset
هيكل DateTime
DateTime هو الهيكل الأساسي لتمثيل لحظة زمنية (تاريخ + وقت). يمكنه تمثيل القيم من 01.01.0001 إلى 31.12.9999.
إنشاء كائن DateTime:
// التاريخ والوقت الحاليانDateTime now = DateTime.Now;DateTime utcNow = DateTime.UtcNow;
// تاريخ ووقت محددانDateTime specificDate = new DateTime(2025, 3, 15, 14, 30, 0); // 15 مارس 2025, 14:30:00
// التحليل من سلسلة نصيةDateTime parsedDate = DateTime.Parse("2025-03-15");
// استخدام TryParse للتحليل الآمنif (DateTime.TryParse("2025-03-15", out DateTime result)){ Console.WriteLine($"تم التحليل بنجاح: {result}");}الخصائص والطرق الأساسية:
Date— يُرجع التاريخ فقط (الوقت = 00:00:00)Year,Month,Day,Hour,Minute,Second— المكونات الفرديةDayOfWeek— يوم الأسبوع (enum)AddDays(),AddMonths(),AddYears()— العمليات الحسابية على التواريخAddHours(),AddMinutes(),AddSeconds()— العمليات الحسابية على الوقت
هيكل TimeSpan
TimeSpan يمثل فترة زمنية (الفاصل الزمني بين لحظتين). إنه ليس تاريخًا، بل مدة زمنية.
// إنشاء TimeSpanTimeSpan interval = new TimeSpan(2, 15, 30); // ساعتان و 15 دقيقة و 30 ثانية
// الفرق بين تاريخينDateTime start = new DateTime(2025, 1, 1);DateTime end = new DateTime(2025, 1, 10);TimeSpan difference = end - start; // 9 أيام
// خصائص TimeSpanConsole.WriteLine($"الأيام: {difference.Days}"); // 9Console.WriteLine($"إجمالي الساعات: {difference.TotalHours}"); // 216Console.WriteLine($"إجمالي الدقائق: {difference.TotalMinutes}"); // 12960
// العمليات الحسابية مع TimeSpanTimeSpan workDay = new TimeSpan(8, 0, 0); // 8 ساعاتTimeSpan breakTime = new TimeSpan(1, 0, 0); // ساعة واحدةTimeSpan actualWork = workDay - breakTime; // 7 ساعاتهيكل DateTimeOffset
DateTimeOffset هو نسخة محسنة من DateTime تراعي الإزاحة بالنسبة لـ UTC. هذا أمر بالغ الأهمية للتطبيقات التي تتعامل مع مستخدمين من مناطق زمنية مختلفة.
// الوقت الحالي مع مراعاة المنطقة الزمنيةDateTimeOffset nowOffset = DateTimeOffset.Now;
// الإنشاء مع تحديد الإزاحةDateTimeOffset withOffset = new DateTimeOffset(2025, 3, 15, 14, 0, 0, TimeSpan.FromHours(3));
// التحويل بين المناطق الزمنيةDateTimeOffset utc = withOffset.ToUniversalTime();DateTimeOffset local = withOffset.ToLocalTime();
// الحصول على الإزاحةConsole.WriteLine($"الإزاحة: {withOffset.Offset}"); // +03:00متى تستخدم DateTimeOffset بدلاً من DateTime؟ إذا كان تطبيقك يتعامل مع مستخدمين من مناطق زمنية مختلفة أو يخزن البيانات بصيغة UTC، فاستخدم DateTimeOffset. هذا يمنع