العمل مع التواريخ في C# (.NET): الأدوات المضمنة والمكتبات الشائعة
العمل مع التواريخ والوقت هو إحدى المهام الأساسية في أي تطوير جاد. في نظام C# (.NET) البيئي، توجد أنواع مضمنة قوية (DateTime، DateTimeOffset، TimeSpan)، بالإضافة إلى مكتبات خارجية تسهل العمليات المعقدة مثل العمل مع المناطق الزمنية، التمثيل المقروء للإنسان، وتحليل التنسيقات غير القياسية. في هذه المقالة، سنستعرض بالتفصيل الأدوات الرئيسية للعمل مع التواريخ في C#.
الأنواع المضمنة في .NET
الفئة الأساسية System.DateTime توفر طرقًا لإنشاء ومقارنة وإجراء العمليات الحسابية وتنسيق التواريخ. وهي تدعم نطاقًا من 01.01.0001 إلى 31.12.9999.
// إنشاء تاريخDateTime now = DateTime.Now; // الوقت المحليDateTime utcNow = DateTime.UtcNow; // UTCDateTime specific = new DateTime(2025, 3, 15, 14, 30, 0);
// العمليات الحسابيةDateTime tomorrow = now.AddDays(1);TimeSpan diff = tomorrow - now;Console.WriteLine(diff.TotalHours); // 24
// التحليل (Parsing)string dateStr = "2025-12-31";DateTime parsed = DateTime.Parse(dateStr, CultureInfo.InvariantCulture);
// التنسيقConsole.WriteLine(now.ToString("dd.MM.yyyy HH:mm")); // 15.03.2025 14:30DateTimeOffset هو إصدار محسّن يخزن الإزاحة بالنسبة لـ UTC. يُوصى به للتطبيقات التي تعمل مع مناطق زمنية مختلفة.
DateTimeOffset nowOffset = DateTimeOffset.Now;Console.WriteLine(nowOffset.Offset); // +03:00 (يعتمد على النظام)TimeSpan لتمثيل الفترات الزمنية. مثالي لقياس مدة العمليات.
TimeSpan duration = new TimeSpan(2, 15, 30); // ساعتان و15 دقيقة و30 ثانيةConsole.WriteLine(duration.TotalMinutes); // 135.5مكتبة NodaTime
NodaTime هي مكتبة بديلة للعمل مع التواريخ والوقت، أنشأها جون سكيت (مؤلف كتب عن C#). تحل العديد من مشاكل DateTime، مثل الغموض وعدم وجود كتابة صارمة للمناطق الزمنية.
التثبيت عبر NuGet:
dotnet add package NodaTimeالأنواع الرئيسية:
Instant— لحظة زمنية (مشابهة لـ Unix timestamp)LocalDateTime— تاريخ+وقت بدون ربط بمنطقة زمنيةZonedDateTime— تاريخ+وقت في منطقة زمنية محددةDurationوPeriod— فترات زمنية (مشابهة لـ TimeSpan، لكن Period يراعي الوحدات التقويمية)
using NodaTime;
// اللحظة الحالية في UTCInstant now = SystemClock.Instance.GetCurrentInstant();Console.WriteLine(now.ToDateTimeUtc()); // يمكن تحويله إلى DateTime
// العمل مع المناطق الزمنيةDateTimeZone tz = DateTimeZoneProviders.Tzdb["Europe/Moscow"];ZonedDateTime moscowTime = now.InZone(tz);Console.WriteLine(moscowTime); // 2025-03-15T17:30:00 Europe/Moscow (+03)
// Period — الفرق بالوحدات التقويميةLocalDate start = new LocalDate(2024, 1, 1);LocalDate end = new LocalDate(2025, 3, 15);Period period = Period.Between(start, end);Console.WriteLine($"مر {period.Years} سنة، {period.Months} شهر، {period.Days} يوم");// مر 1 سنة، 2 شهر، 14 يوممزايا NodaTime: كتابة صارمة، عمل صحيح مع المناطق الزمنية التاريخية، دعم التقاويم (الإسلامي، العبري وغيرها)، عدم وجود غموض عند تغيير الساعة.
مكتبة Humanizer
Humanizer هي مكتبة لـ "إضفاء الطابع الإنساني" على البيانات، بما في ذلك التواريخ والفترات. تسمح بعرض التواريخ بشكل مقروء: "أمس"، "بعد 3 ساعات"، "قبل يومين".
التثبيت:
dotnet add package Humanizerأمثلة على الاستخدام