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

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

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

ابدأ الدورة

العمل مع التواريخ في 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:30


DateTimeOffset هو إصدار محسّن يخزن الإزاحة بالنسبة لـ 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


أمثلة على الاستخدام

توصيات