العمل مع التواريخ في C# (.NET): نظرة شاملة على المكتبات والأدوات المدمجة
معالجة التواريخ والوقت هي واحدة من أكثر المهام شيوعًا في التطوير. في نظام C# (.NET) البيئي، توجد وظائف مدمجة قوية (System.DateTime) بالإضافة إلى مكتبات خارجية تسهل السيناريوهات المعقدة: العمل مع المناطق الزمنية، التنسيق، الفواصل الزمنية والتحليل. في هذه المقالة، سنستعرض الأدوات الرئيسية، بما في ذلك الإمكانيات الحديثة لـ .NET 6+ وحزم NuGet الشائعة.
1. الأدوات المدمجة: DateTime، DateOnly، TimeOnly
الفئة الأساسية System.DateTime متاحة منذ الإصدارات الأولى لـ .NET. وهي تدعم:
- إنشاء تاريخ:
new DateTime(2025, 3, 15) - العمليات الحسابية:
date.AddDays(10)،date.AddMonths(-1) - المقارنة:
date1 > date2 - التنسيق:
date.ToString("yyyy-MM-dd")
ابتداءً من .NET 6، ظهرت الأنواع DateOnly و TimeOnly - وهي خالية من الارتباط بالمنطقة الزمنية وتخزن التاريخ فقط أو الوقت فقط. وهذا مناسب لأعياد الميلاد، جداول العمل والمواعيد.
using System;
DateOnly birthday = new DateOnly(1990, 5, 20);TimeOnly alarm = new TimeOnly(7, 30);
Console.WriteLine($"التاريخ: {birthday}, الوقت: {alarm}");// الإخراج: التاريخ: 20.05.1990, الوقت: 07:302. TimeSpan — الفواصل الزمنية
للعمل مع الفترات الزمنية، يُستخدم TimeSpan. فهو يسمح بحساب الفرق بين التواريخ، مدة العمليات والمهلات الزمنية.
DateTime start = DateTime.Now;// ... تنفيذ الكود ...DateTime end = DateTime.Now;
TimeSpan elapsed = end - start;Console.WriteLine($"المدة المنقضية: {elapsed.TotalSeconds} ثانية.");3. Noda Time — العمل المتقدم مع التواريخ
Noda Time (NuGet: NodaTime) هي مكتبة من تأليف جون سكيت (مؤلف كتاب مشهور عن C#). وهي تحل مشاكل DateTime:
- فصل واضح بين "لحظة زمنية" (
Instant)، "تاريخ في التقويم" (LocalDate) و"وقت مع منطقة زمنية" (ZonedDateTime). - دعم التقاويم (الإسلامي، العبري، الياباني).
- ثبات جميع الأنواع (Immutable).
- معالجة صحيحة للمناطق الزمنية عبر قاعدة بيانات IANA (tzdata).
using NodaTime;
Instant now = SystemClock.Instance.GetCurrentInstant();DateTimeZone zone = DateTimeZoneProviders.Tzdb["Europe/Moscow"];ZonedDateTime moscowTime = now.InZone(zone);
Console.WriteLine($"الوقت الحالي في موسكو: {moscowTime:yyyy-MM-dd HH:mm}");
// العمل مع LocalDateLocalDate today = LocalDate.FromDateTime(DateTime.Today);LocalDate nextWeek = today.PlusDays(7);Noda Time مفيدة بشكل خاص في المشاريع التي تكون فيها دقة المناطق الزمنية أمرًا بالغ الأهمية (السجلات، الحجوزات، الأنظمة الدولية).
4. Humanizer — تواريخ قابلة للقراءة البشرية
Humanizer (NuGet: Humanizer.Core) هي مكتبة لتحويل الأرقام والتواريخ والوقت إلى لغة طبيعية. وهي قادرة على:
- عرض الوقت النسبي: "منذ 3 دقائق"، "بعد يومين".
- تصريف أسماء الأشهر وأيام الأسبوع.
- تنسيق الفواصل الزمنية: "ساعة و30 دقيقة".
using Humanizer;
DateTime pastDate = DateTime.UtcNow.AddHours(-5);Console.WriteLine(pastDate.Humanize()); // "منذ 5 ساعات"
TimeSpan span = new TimeSpan(2, 45, 0);Console.WriteLine(span.Humanize()); // "ساعتان و45 دقيقة"Humanizer يدعم التوطين (اللغة العربية — Humanizer.Core.ar).
5. FluentDateTime — واجهة fluent لـ DateTime
FluentDateTime (NuGet: FluentDateTime) — يضيف دوال امتداد لـ