تحليل Unix Timestamp في C#: من الطابع الزمني إلى DateTime والعكس

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

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

ابدأ الدورة

مقدمة: لماذا Unix Timestamp ليس مجرد رقم

\n

كل مطور يعمل مع API، قواعد البيانات أو السجلات، سيواجه عاجلاً أم آجلاً Unix timestamp. إنه عدد صحيح (أو عدد عشري) يمثل عدد الثواني المنقضية منذ 1 يناير 1970 00:00:00 UTC - ما يسمى عصر Unix (Unix epoch).

\n

ولكن عندما ترى في رد الخادم الرقم 1719878400، لا يستطيع عقلك أن يقول فوراً: "أها، هذا هو 2 يوليو 2024". نحتاج إلى تحويله إلى DateTime المألوف. والعكس صحيح - حفظ التاريخ كطابع زمني للإرسال.

\n

على Stack Overflow، حصد سؤال "How can I convert a Unix timestamp to DateTime and vice versa?" مئات الآلاف من المشاهدات. هذا يعني أنه حتى مطوري C# ذوي الخبرة يخلطون أحياناً في التفاصيل الدقيقة. في هذه المقالة، لن نقدم فقط وصفات جاهزة، بل سننظر تحت الغطاء: سنحلل كيف تعمل DateTime، DateTimeOffset، التيكات والمناطق الزمنية.

\n\n

ما هو Unix Timestamp في الواقع؟

\n

قبل كتابة الكود، دعونا نتفق على المصطلحات. Unix timestamp هو عدد الثواني (أحياناً الميلي ثانية) منذ منتصف ليل 1 يناير 1970 بتوقيت UTC. المهم: إنها لحظة زمنية مطلقة، لا تعتمد على المنطقة الزمنية. لهذا السبب من السهل استخدامها في الأنظمة الموزعة.

\n

في C#، نعمل مع نوعين رئيسيين:

\n
    \n
  • DateTime - النوع الكلاسيكي، الذي يمكن أن يكون إما بتوقيت UTC أو بالتوقيت المحلي (خاصية Kind).
  • \n
  • DateTimeOffset - نوع أكثر حداثة، يخزن صراحة الإزاحة عن UTC. يُوصى به للمشاريع الجديدة.
  • \n
\n

تحت الغطاء، يخزن DateTime عدد التيكات (فترات زمنية مقدارها 100 نانو ثانية) منذ 1 يناير من العام 0001. و Unix timestamp هو مجرد عدد الثواني منذ عام 1970. للانتقال من واحد إلى الآخر، تحتاج إلى حساب الفرق بين هذين العصرين.

\n\n

تحويل Unix Timestamp إلى DateTime (والعكس) - الطرق الأساسية

\n

بدءاً من .NET Framework 4.6 و .NET Core، ظهرت في C# طرق مدمجة تجعل الحياة أسهل. دعونا نلقي نظرة عليها.

\n\n

1. من Unix timestamp (ثوانٍ) إلى DateTime

\n

أسهل طريقة هي استخدام DateTimeOffset.FromUnixTimeSeconds(). يُرجع DateTimeOffset، والذي يمكن تحويله بعد ذلك إلى DateTime.

\n
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. ولكن كن حذراً: الوقت المحلي يعتمد على إعدادات الخادم أو الكمبيوتر.

\n\n

2. من DateTime إلى Unix timestamp

\n

التحويل العكسي - عبر طريقة ToUnixTimeSeconds() في DateTimeOffset.

\n
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 أن الوقت محلي، وستحصل على طابع زمني غير صحيح - مع إزاحة حسب منطقتك الزمنية.

\n\n

3. العمل مع الميلي ثانية

\n

أحياناً يتم إرسال الطابع الزمني بالميلي ثانية (مثلاً، من JavaScript). لهذا الغرض

المدونات

توصيات الكتب