العمل مع التواريخ في C# (.NET): نظرة عامة على المكتبات والأدوات المدمجة

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

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

ابدأ الدورة

العمل مع التواريخ في C# (.NET): من الأدوات المدمجة إلى المكتبات المتخصصة



العمل مع التواريخ والوقت هو أحد المهام الأساسية في تطوير أي تطبيق: من خدمات الويب إلى الأدوات المكتبية. توفر منصة .NET أدوات مدمجة قوية مثل DateTime و DateTimeOffset و TimeSpan. ومع ذلك، في السيناريوهات المعقدة (العمل مع المناطق الزمنية، الفواصل الزمنية القابلة للقراءة البشرية، تحليل التنسيقات غير القياسية) غالبًا ما يلجأ المطورون إلى المكتبات الخارجية. في هذه المقالة، سنستعرض الأدوات الرئيسية للعمل مع التواريخ في C#.



1. الأدوات المدمجة في .NET



الأنواع الأساسية للعمل مع التواريخ في .NET:



  • DateTime — يمثل لحظة زمنية (تاريخ + وقت). يدعم عمليات الجمع والطرح والمقارنة.
  • DateTimeOffset — مشابه لـ DateTime، ولكن مع تحديد صريح للإزاحة بالنسبة لـ UTC. يُوصى به لتخزين التواريخ في الأنظمة الموزعة.
  • TimeSpan — فاصل زمني (مثل ساعتين و30 دقيقة).
  • DateOnly و TimeOnly (منذ .NET 6) — للتخزين المنفصل للتاريخ والوقت بدون بيانات إضافية.


مثال على استخدام DateTime:

using System;

DateTime now = DateTime.Now;DateTime utcNow = DateTime.UtcNow;DateTime specificDate = new DateTime(2025, 3, 15, 14, 30, 0);

// التنسيقstring formatted = now.ToString("dd.MM.yyyy HH:mm:ss");Console.WriteLine(formatted); // 15.03.2025 14:30:00

// العمليات الحسابيةDateTime tomorrow = now.AddDays(1);TimeSpan diff = tomorrow - now;Console.WriteLine($"حتى الغد: {diff.TotalHours} ساعات");


تحليل التواريخ من السلاسل النصية:

string dateStr = "2025-03-15";if (DateTime.TryParse(dateStr, out DateTime result)){    Console.WriteLine(result.ToShortDateString());}

// التحليل مع تحديد الثقافةvar culture = new System.Globalization.CultureInfo("ru-RU");DateTime parsed = DateTime.Parse("15 марта 2025", culture);


2. Noda Time — العمل المتقدم مع التواريخ والوقت



Noda Time — مكتبة بديلة من المجتمع، تم إنشاؤها لمعالجة عيوب DateTime المدمج. الميزات الرئيسية:



  • فصل واضح للمفاهيم: Instant (لحظة في UTC)، LocalDateTime (تاريخ+وقت بدون ربط بمنطقة)، ZonedDateTime (مع منطقة زمنية).
  • دعم كامل للمناطق الزمنية من خلال قاعدة بيانات IANA (Olson).
  • أنواع غير قابلة للتغيير (immutable) — آمنة في الكود متعدد الخيوط.
  • فواصل زمنية قابلة للقراءة البشرية (Period): سنتان، 3 أشهر، 5 أيام.


مثال على العمل مع Noda Time:

using NodaTime;using NodaTime.Text;

// اللحظة الحالية في UTCInstant now = SystemClock.Instance.GetCurrentInstant();Console.WriteLine($"Instant: {now}");

// التحويل إلى الوقت المحلي مع المنطقة الزمنيةDateTimeZone zone = DateTimeZoneProviders.Tzdb["Europe/Moscow"];ZonedDateTime moscowTime = now.InZone(zone);Console.WriteLine($"الوقت في موسكو: {moscowTime}");

// تحليل التاريخ بتنسيق محددvar pattern = LocalDatePattern.CreateWithInvariantCulture("yyyy-MM-dd");LocalDate date = pattern.Parse("2025-03-15").Value;Console.WriteLine(date); // 15 مارس 2025

// العمل مع الفتراتLocalDate start = new LocalDate(2025, 1, 1);LocalDate end = new LocalDate(2025, 12, 31);Period period = Period.Between(start, end, PeriodUnits.Days);Console.WriteLine($"الأيام بين التاريخين: {period.Days}");


3. Humanizer — التواريخ والفواصل الزمنية القابلة للقراءة البشرية



Humanizer — مكتبة لتحويل الأرقام والتواريخ والسلاسل النصية إلى شكل مناسب للبشر. في سياق التواريخ، ت

توصيات