مقدمة: لماذا Unix Timestamp ليس مجرد رقم
\nكل مطور يعمل مع API، قواعد البيانات أو السجلات، سيواجه عاجلاً أم آجلاً Unix timestamp. إنه عدد صحيح (أو عدد عشري) يمثل عدد الثواني المنقضية منذ 1 يناير 1970 00:00:00 UTC - ما يسمى عصر Unix (Unix epoch).
\nولكن عندما ترى في رد الخادم الرقم 1719878400، لا يستطيع عقلك أن يقول فوراً: "أها، هذا هو 2 يوليو 2024". نحتاج إلى تحويله إلى DateTime المألوف. والعكس صحيح - حفظ التاريخ كطابع زمني للإرسال.
على Stack Overflow، حصد سؤال "How can I convert a Unix timestamp to DateTime and vice versa?" مئات الآلاف من المشاهدات. هذا يعني أنه حتى مطوري C# ذوي الخبرة يخلطون أحياناً في التفاصيل الدقيقة. في هذه المقالة، لن نقدم فقط وصفات جاهزة، بل سننظر تحت الغطاء: سنحلل كيف تعمل DateTime، DateTimeOffset، التيكات والمناطق الزمنية.
ما هو Unix Timestamp في الواقع؟
\nقبل كتابة الكود، دعونا نتفق على المصطلحات. Unix timestamp هو عدد الثواني (أحياناً الميلي ثانية) منذ منتصف ليل 1 يناير 1970 بتوقيت UTC. المهم: إنها لحظة زمنية مطلقة، لا تعتمد على المنطقة الزمنية. لهذا السبب من السهل استخدامها في الأنظمة الموزعة.
\nفي C#، نعمل مع نوعين رئيسيين:
\n- \n
DateTime- النوع الكلاسيكي، الذي يمكن أن يكون إما بتوقيت UTC أو بالتوقيت المحلي (خاصيةKind). \n DateTimeOffset- نوع أكثر حداثة، يخزن صراحة الإزاحة عن UTC. يُوصى به للمشاريع الجديدة. \n
تحت الغطاء، يخزن DateTime عدد التيكات (فترات زمنية مقدارها 100 نانو ثانية) منذ 1 يناير من العام 0001. و Unix timestamp هو مجرد عدد الثواني منذ عام 1970. للانتقال من واحد إلى الآخر، تحتاج إلى حساب الفرق بين هذين العصرين.
تحويل Unix Timestamp إلى DateTime (والعكس) - الطرق الأساسية
\nبدءاً من .NET Framework 4.6 و .NET Core، ظهرت في C# طرق مدمجة تجعل الحياة أسهل. دعونا نلقي نظرة عليها.
\n\n1. من Unix timestamp (ثوانٍ) إلى DateTime
\nأسهل طريقة هي استخدام DateTimeOffset.FromUnixTimeSeconds(). يُرجع DateTimeOffset، والذي يمكن تحويله بعد ذلك إلى DateTime.
long unixTimestamp = 1719878400; // 2 يوليو 2024، 00:00:00 UTC\n\n// الحصول على DateTimeOffset\nDateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(unixTimestamp);\n\n// التحويل إلى DateTime (UTC)\nDateTime utcDateTime = dateTimeOffset.UtcDateTime;\n\nConsole.WriteLine(utcDateTime); // 02.07.2024 0:00:00\nإذا كنت بحاجة إلى الوقت المحلي (مثلاً، لعرضه للمستخدم)، استخدم dateTimeOffset.LocalDateTime. ولكن كن حذراً: الوقت المحلي يعتمد على إعدادات الخادم أو الكمبيوتر.
2. من DateTime إلى Unix timestamp
\nالتحويل العكسي - عبر طريقة ToUnixTimeSeconds() في DateTimeOffset.
DateTime utcDateTime = new DateTime(2024, 7, 2, 0, 0, 0, DateTimeKind.Utc);\n\n// إنشاء DateTimeOffset مع تحديد UTC صراحة\nDateTimeOffset dateTimeOffset = new DateTimeOffset(utcDateTime);\n\nlong unixTimestamp = dateTimeOffset.ToUnixTimeSeconds();\n\nConsole.WriteLine(unixTimestamp); // 1719878400\nمن المهم جداً: حدد دائماً DateTimeKind.Utc عند إنشاء DateTime الذي تنوي تحويله. إذا لم تفعل ذلك، سيفترض DateTimeOffset أن الوقت محلي، وستحصل على طابع زمني غير صحيح - مع إزاحة حسب منطقتك الزمنية.
3. العمل مع الميلي ثانية
\nأحياناً يتم إرسال الطابع الزمني بالميلي ثانية (مثلاً، من JavaScript). لهذا الغرض