العمل مع التواريخ والأوقات في C#: تقنيات متقدمة وتحسين الأداء

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

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

ابدأ الدورة

العمل المتقدم مع التواريخ والأوقات في C#: من العمليات الأساسية إلى الحلول عالية الأداء

\n

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

\n\n

1. DateTime وDateTimeOffset وTimeSpan: اختيار النوع الصحيح

\n

يستخدم العديد من المطورين DateTime بشكل افتراضي، ولكن في العالم الحديث للأنظمة الموزعة، غالبًا ما يكون هذا ليس الخيار الأفضل. دعنا نستعرض الاختلافات الرئيسية.

\n\n

DateTime مقابل DateTimeOffset

\n

DateTime يخزن لحظة زمنية دون ربط صريح بمنطقة زمنية. يمكنك تحديد Kind (Local, Utc, Unspecified)، ولكن هذه مجرد علامة وليست معلومات كاملة عن الإزاحة. بينما DateTimeOffset يخزن دائمًا الإزاحة من UTC، مما يجعله لا لبس فيه ومفضلًا للتخزين في قواعد البيانات وواجهات API.

\n
// DateTime — قد يكون مضللاً\nDateTime localNow = DateTime.Now; // Kind = Local\nDateTime utcNow = DateTime.UtcNow; // Kind = Utc\n\n// DateTimeOffset — دائمًا إزاحة صريحة\nDateTimeOffset preciseNow = DateTimeOffset.Now; // +03:00 (مثال)\nDateTimeOffset utcOffset = DateTimeOffset.UtcNow; // +00:00\n\n// التحويل بينهما\nDateTimeOffset fromDateTime = new DateTimeOffset(2024, 12, 25, 10, 0, 0, TimeSpan.FromHours(3));\nConsole.WriteLine(fromDateTime.Offset); // 03:00:00\n
\n

توصية: لتخزين لحظة زمنية (مثل تاريخ إنشاء سجل)، استخدم DateTimeOffset. لعرضها للمستخدم بالتوقيت المحلي، قم بالتحويل على مستوى طبقة العرض.

\n\n

TimeSpan للفترات الزمنية

\n

TimeSpan لا يخزن تاريخًا، بل فقط فترة زمنية. إنها أداة لا غنى عنها للعمليات الحسابية على التواريخ وقياس مدة العمليات.

\n
DateTimeOffset start = DateTimeOffset.UtcNow;\n// ... عملية طويلة ما ...\nDateTimeOffset end = DateTimeOffset.UtcNow;\n\nTimeSpan duration = end - start;\nConsole.WriteLine($"استغرقت العملية {duration.TotalMilliseconds} مللي ثانية");\n// إنشاء فترة زمنية\nTimeSpan workDay = new TimeSpan(8, 0, 0); // 8 ساعات\nDateTimeOffset deadline = DateTimeOffset.UtcNow.Add(workDay);\n
\n\n

2. التحليل والتنسيق: الثقافة، ISO 8601 والأداء

\n

التحليل غير الصحيح هو مصدر للأخطاء في التطبيقات التي تعمل بإعدادات إقليمية مختلفة. دعنا نستعرض الطرق المتقدمة.

\n\n

ParseExact وTryParseExact

\n

استخدم ParseExact للسلاسل ذات التنسيق المعروف والصارم. هذا يزيد من الموثوقية وقابلية قراءة الكود.

\n
string dateString = "2024-12-25T10:30:00+03:00";\n// ISO 8601 — تنسيق عالمي\nDateTimeOffset parsed = DateTimeOffset.ParseExact(\n    dateString,\n    "yyyy-MM-dd'T'HH:mm:sszzz",\n    CultureInfo.InvariantCulture\n);\nConsole.WriteLine(parsed); // 25.12.2024 10:30:00 +03:00\n\n// تحليل آمن باستخدام TryParseExact\nif (DateTimeOffset.TryParseExact(\n    "2024/12/25",\n    new[] { "yyyy/MM/dd", "dd.MM.yyyy" },\n    CultureInfo.InvariantCulture,\n    DateTimeStyles.None,\n    out DateTimeOffset result))\n{\n    Console.WriteLine($"تم التحليل بنجاح: {result}");\n}\n
\n

نصيحة: لتخزين التواريخ في السجلات وواجهات API، استخدم دائمًا تنسيق ISO 8601 (مُحدد "o"). هذا يضمن قراءة لا لبس فيها من قبل أي نظام.

\n\n

التنسيق مع مراعاة الثقافة

\n

عند العرض للمستخدم، ضع في اعتبارك لغته المحلية، ولكن للتبادل الداخلي استخدم الثقافة الثابتة (InvariantCulture).

المدونات

توصيات الكتب