كيفية تحويل Unix Timestamp إلى تاريخ: دليل المطور الشامل

Developer guide to convert unix timestamp to date showing epoch datetime conversion with code examples

إذا سبق وأن نظرت إلى رقم مثل 1717200000 وتساءلت عن التاريخ الذي يمثله، فأنت لست وحدك. تعلم تحويل الطابع الزمني Unix إلى تاريخ هو مهارة أساسية للمطورين الذين يعملون مع واجهات برمجة التطبيقات وقواعد البيانات والأنظمة الخلفية. الطابع الزمني Unix هو ببساطة عدد الثواني (أو الميلي ثانية) المنقضية منذ 1 يناير 1970، الساعة 00:00:00 بتوقيت UTC، وهي نقطة مرجعية تُعرف باسم عصر Unix. يرشدك هذا الدليل خلال آليات تحويل التاريخ والوقت، والتعامل مع المناطق الزمنية، وأمثلة الكود العملية في JavaScript و Python و SQL، حتى تتمكن من التوقف عن التخمين والبدء في التحويل بثقة.

النقاط الرئيسية:

  • يحسب الطابع الزمني Unix الثواني من 1 يناير 1970 UTC (العصر 0)، مما يجعله محايد المنطقة الزمنية بالتصميم.
  • تأكد دائماً من كون الطابع الزمني بالثواني أم بالميلي ثانية قبل التحويل، حيث أن خلطهما هو المصدر الأكثر شيوعاً للأخطاء.
  • يجب تطبيق إزاحات المناطق الزمنية صراحة بعد التحويل إلى UTC، وليس قبلها.
  • JavaScript و Python و SQL لكل منها دوال مدمجة لتحويل Unix إلى تاريخ، لكن لكل منها خصائصه التي يجب الانتباه إليها.

ما هو الطابع الزمني Unix؟

يمثل الطابع الزمني Unix لحظة واحدة وواضحة في الزمن كعدد صحيح. بدأت الساعة في العد في 1 يناير 1970، الساعة 00:00:00 UTC، وهي لحظة تُسمى "العصر 0". كل ثانية تمر منذ ذلك الحين تضيف واحداً إلى العداد. هذه البساطة هي بالضبط السبب في أنه أصبح تنسيق الوقت العالمي لأنظمة الحوسبة.

لا توجد أشهر، ولا سنوات كبيسة، ولا تعديلات للتوقيت الصيفي مدمجة في الرقم نفسه. الطابع الزمني يعتمد دائماً على UTC، مما يعني أن نفس الرقم يشير إلى نفس اللحظة بالضبط في الزمن بغض النظر عن مكان وجود الخادم أو المستخدم. هذه هي أكبر نقطة قوة فيه ومصدر معظم الالتباس لدى المطورين حول التعامل مع تنسيق الوقت.

للحصول على نظرة أعمق حول كيف أصبح وقت العصر أساس الحوسبة الحديثة، راجع مقالنا حول وقت العصر: أساس الطوابع الزمنية Unix.

تمييز مهم: ليس كل الطوابع الزمنية Unix تحسب بالثواني. بعض الأنظمة، خاصة بيئات JavaScript والعديد من REST APIs، تستخدم الميلي ثانية. الطابع الزمني 1717200000 بالثواني؛ 1717200000000 هو نفس اللحظة بالميلي ثانية. خلط هذين هو الخطأ الأكثر تكراراً في تحويل التاريخ والوقت. قبل أن تكتب سطر كود واحد، تأكد من الوحدة التي يستخدمها مصدرك.

غير متأكد من الوحدة التي يجب أن يستخدمها نظامك؟ راجع الثواني مقابل الميلي ثانية مقابل المايكرو ثانية: أي طابع زمني Unix يجب أن تستخدم؟ للحصول على تحليل عملي.

مخطط يوضح الطابع الزمني unix يحسب الثواني من العصر 0 في 1 يناير 1970 UTC

التعامل مع المناطق الزمنية وأخطاء الإزاحة الشائعة

تحويل المنطقة الزمنية Unix هو المكان الذي يتعثر فيه معظم المطورين. الطابع الزمني نفسه دائماً UTC. المنطقة الزمنية مهمة فقط عندما تعرض أو تفسر ذلك الطابع الزمني للمستخدم أو إدخال السجل. فهم هذا التمييز يمنع فئة كاملة من الأخطاء.

أساسيات UTC

RFC 3339 يحدد التنسيق المعياري لتمثيل أوقات UTC في النص (2024-06-01T00:00:00Z). عندما تحول طابع زمني Unix إلى نص قابل للقراءة، فأنت تطبق إزاحة منطقة زمنية على أساس UTC. الإزاحة الموجبة مثل +05:30 (التوقيت المعياري الهندي) تضيف ساعات ودقائق؛ الإزاحة السالبة مثل -05:00 (التوقيت المعياري الشرقي الأمريكي) تطرحها.

الكشف التلقائي عن المنطقة الزمنية

معظم اللغات والمتصفحات الحديثة يمكنها كشف المنطقة الزمنية المحلية تلقائياً. في JavaScript، Intl.DateTimeFormat().resolvedOptions().timeZone يعيد اسم المنطقة الزمنية IANA (مثل America/New_York). في Python، وحدة zoneinfo (Python 3.9+) تتعامل مع مناطق IANA محلياً. الاعتماد على الكشف التلقائي جيد لأغراض العرض، لكن لا تعتمد عليه أبداً لتخزين أو حساب الطوابع الزمنية.

أخطاء الإزاحة الشائعة

  • التعامل مع الوقت المحلي كـ UTC: إذا كان خادمك مضبوط على UTC+2 وتستدعي datetime.now() بدون تحديد منطقة زمنية، تحصل على وقت محلي يبدو كـ UTC لكنه منحرف بساعتين.
  • انتقالات التوقيت الصيفي (DST): الإزاحة الثابتة مثل +01:00 لا تحسب للتوقيت الصيفي. استخدم مناطق IANA المسماة (Europe/Berlin) بدلاً من الإزاحات الثابتة كلما أمكن.
  • عدم تطابق الميلي ثانية مقابل الثانية: تمرير طابع زمني بالميلي ثانية إلى دالة تتوقع ثواني ينتج تاريخ في السنة 55000+. تحقق دائماً من حجم الرقم أولاً.
  • إعدادات المنطقة الزمنية لقاعدة البيانات: MySQL و PostgreSQL يمكنهما تخزين وعرض الطوابع الزمنية بشكل مختلف اعتماداً على المنطقة الزمنية للجلسة. خزن الطوابع الزمنية في UTC وحول في طبقة التطبيق.

أمثلة الكود: JavaScript و Python و SQL

المقاطع التالية تغطي أكثر السيناريوهات شيوعاً لتحويل Unix إلى تاريخ. كل مثال يستخدم طابع زمني محدد: 1717200000، والذي يقابل 1 يونيو 2024، 00:00:00 UTC.

JavaScript: تحويل الطابع الزمني Unix

كائن Date في JavaScript يعمل بالميلي ثانية، لذا اضرب الطابع الزمني المبني على الثواني في 1000 أولاً.

// JavaScript تحويل الطابع الزمني unix إلى تاريخ
const unixSeconds = 1717200000;
const date = new Date(unixSeconds * 1000); // التحويل إلى ميلي ثانية

// نص UTC
console.log(date.toUTCString());
// الناتج: "Sat, 01 Jun 2024 00:00:00 GMT"

// عرض المنطقة الزمنية المحلية (يستخدم المنطقة الزمنية للمتصفح/النظام)
console.log(date.toLocaleString("en-US", { timeZone: "America/New_York" }));
// الناتج: "5/31/2024, 8:00:00 PM"

// تنسيق ISO 8601
console.log(date.toISOString());
// الناتج: "2024-06-01T00:00:00.000Z"

لاحظ كيف يعرض نفس الطابع الزمني كـ 31 مايو في نيويورك لأن منتصف الليل UTC هو 8 مساءً بالتوقيت الشرقي في اليوم السابق. هذا ليس خطأ؛ إنه سلوك تحويل المنطقة الزمنية Unix الصحيح.

Python: الطابع الزمني Unix إلى التاريخ والوقت

وحدة datetime في Python توفر طرق نظيفة وصريحة. استخدم دائماً كائنات datetime مدركة للمنطقة الزمنية في كود الإنتاج.

from datetime import datetime, timezone
from zoneinfo import ZoneInfo  # Python 3.9+

unix_seconds = 1717200000

# Python الطابع الزمني unix إلى datetime (UTC)
dt_utc = datetime.fromtimestamp(unix_seconds, tz=timezone.utc)
print(dt_utc)
# الناتج: 2024-06-01 00:00:00+00:00

# التحويل إلى منطقة زمنية محددة
dt_tokyo = dt_utc.astimezone(ZoneInfo("Asia/Tokyo"))
print(dt_tokyo)
# الناتج: 2024-06-01 09:00:00+09:00

# التنسيق كنص قابل للقراءة
print(dt_utc.strftime("%B %d, %Y at %H:%M UTC"))
# الناتج: June 01, 2024 at 00:00 UTC

استخدام datetime.fromtimestamp() بدون معامل tz يعيد datetime ساذج (غير مدرك للمنطقة الزمنية) بالوقت المحلي للنظام، مما قد يسبب أخطاء صامتة في بيئات الخادم. مرر دائماً tz=timezone.utc كعادة.

SQL: العصر إلى التاريخ والوقت

كل من PostgreSQL و MySQL يدعمان تحويل العصر إلى التاريخ والوقت مباشرة.

-- PostgreSQL: تحويل الطابع الزمني unix إلى تاريخ
SELECT TO_TIMESTAMP(1717200000) AS converted_date;
-- الناتج: 2024-06-01 00:00:00+00

-- MySQL: تحويل unix إلى تاريخ
SELECT FROM_UNIXTIME(1717200000) AS converted_date;
-- الناتج: 2024-06-01 00:00:00
-- ملاحظة: FROM_UNIXTIME تستخدم المنطقة الزمنية للجلسة. اضبطها صراحة:
SET time_zone = '+00:00';
SELECT FROM_UNIXTIME(1717200000);

للحصول على إرشادات أعمق حول تخزين واستعلام الطوابع الزمنية في قواعد البيانات، راجع الطوابع الزمنية Unix في قواعد البيانات: أفضل الممارسات للتخزين والاستعلامات.

حالات الاستخدام الشائعة: تحويل العصر إلى التاريخ في الأنظمة الحقيقية

فهم الآليات شيء واحد. رؤية كيف يعمل تحويل العصر إلى التاريخ في الأنظمة الحقيقية يجعله يلتصق. هنا ثلاث سيناريوهات محددة مستمدة من أنماط تطوير SaaS الشائعة.

دراسة حالة: تحليل REST API، تخزين قاعدة البيانات، وتسجيل الخادم الخلفي

تخيل منصة تحليلات SaaS تستقبل الأحداث من REST API طرف ثالث. كل استجابة API تتضمن حقل مثل "event_time": 1717200000. إليك كيف يتعامل الفريق معه في كل طبقة:

1. تحليل REST API
تتلقى خدمة الخادم الخلفي حمولة JSON وتتحقق فوراً من وحدة الطابع الزمني. لأن القيمة طولها 10 أرقام، يؤكد الفريق أنها بالثواني (13 رقم يشير إلى الميلي ثانية). تحول خدمة Python القيمة إلى كائن datetime مدرك لـ UTC قبل أي معالجة إضافية. هذا يضمن أن الدوال اللاحقة لا تتلقى عدد صحيح خام بالخطأ.

2. تخزين قاعدة البيانات
تخزن المنصة القيمة في عمود PostgreSQL مكتوب كـ TIMESTAMPTZ (طابع زمني مع منطقة زمنية). يدرج التطبيق دائماً في UTC باستخدام TO_TIMESTAMP(1717200000). التخزين في UTC يعني أنه عندما تتوسع الشركة لخدمة المستخدمين في مناطق متعددة، لا حاجة لترحيل البيانات. الاستعلامات دائماً تفلتر في UTC وتحول إلى الوقت المحلي فقط في طبقة العرض.

3. تسجيل الخادم الخلفي
يرفق خط تسجيل السجلات نص ISO 8601 UTC (2024-06-01T00:00:00Z) إلى كل إدخال سجل جنباً إلى جنب مع الطابع الزمني Unix الخام. هذا النهج المزدوج يعني أن المهندسين يمكنهم قراءة السجلات مباشرة بدون أداة تحويل، بينما أنظمة المراقبة الآلية يمكنها لا تزال تقوم بحساب دقيق على القيم الصحيحة. عندما يقول تقرير خطأ "حدث الخطأ حوالي 9 صباحاً بتوقيت طوكيو"، يحول الفريق ذلك إلى نطاق طابع زمني Unix ويستعلم السجلات مباشرة.

هذا النمط ثلاثي الطبقات (تحليل، تخزين في UTC، عرض محلياً) هو أنظف طريقة للتعامل مع تحويل التاريخ والوقت في أي نظام إنتاج.

نصيحة سريعة: إذا كنت تعمل مع بوتات Discord أو خوادم المجتمع، فإن الطوابع الزمنية Unix تشغل أيضاً تنسيق الطابع الزمني الأصلي لـ Discord. تعلم كيف في دليلنا حول كيف تعمل الطوابع الزمنية Discord وكيفية استخدامها في خادمك.

الخلاصة

تحويل الطابع الزمني Unix إلى تاريخ قابل للقراءة أمر مباشر بمجرد أن تفهم القواعد الثلاث: الطابع الزمني دائماً UTC، الوحدة إما ثواني أو ميلي ثانية (تأكد قبل التحويل)، وإزاحات المناطق الزمنية تطبق في وقت العرض، وليس وقت التخزين. سواء كنت تكتب JavaScript أو Python أو SQL، الأدوات المدمجة موثوقة طالما تستخدمها مع معاملات المنطقة الزمنية الصريحة. طبق النمط ثلاثي الطبقات من دراسة الحالة أعلاه (تحليل، تخزين في UTC، عرض محلياً) وستتجنب أكثر المخاطر شيوعاً في تحويل التاريخ والوقت عبر أي نظام SaaS.

أداة تحويل الطابع الزمني Unix إلى تاريخ على unixtimestamp.app

حول أي طابع زمني Unix فوراً

الصق أي طابع زمني واحصل على التاريخ UTC الدقيق، والوقت المحلي، وتفصيل المنطقة الزمنية بنقرة واحدة. لا إعداد، لا تسجيل مطلوب.

جرب المحول المجاني في unixtimestamp.app ←

الطابع الزمني المبني على الثواني هو رقم من 10 أرقام (للتواريخ حوالي 2026)، بينما الطابع الزمني المبني على الميلي ثانية هو 13 رقم. كائن Date في JavaScript يستخدم الميلي ثانية محلياً. لتحويل طابع زمني بالثواني في JavaScript، اضربه في 1000 قبل تمريره إلى new Date(). خلط الوحدتين هو السبب الأكثر شيوعاً للتواريخ الخاطئة جداً.

هذا سلوك متوقع، وليس خطأ. الطابع الزمني Unix يمثل لحظة UTC. إذا كان منتصف الليل UTC يقع في اليوم التقويمي السابق لمنطقتك الزمنية (مثلاً، UTC 00:00 هو 8 مساءً بالتوقيت الشرقي في اليوم السابق)، فسيختلف التاريخ المعروض. حدد دائماً المنطقة الزمنية المستهدفة صراحة عند التنسيق للعرض.

استخدم datetime.fromtimestamp(ts, tz=timezone.utc) من وحدة datetime. هذا يعيد كائن datetime UTC مدرك للمنطقة الزمنية. تجنب استدعاء datetime.fromtimestamp() بدون معامل tz، حيث يستخدم المنطقة الزمنية المحلية للنظام وينشئ datetime ساذج قد يسبب أخطاء صامتة في بيئات الخادم.

خزن الطوابع الزمنية كـ TIMESTAMPTZ (PostgreSQL) أو كأعداد صحيحة UTC. تجنب تخزين النصوص المنسقة مثل "1 يونيو 2024" لأنها أصعب في الاستعلام والترتيب والمقارنة. حول إلى التنسيق القابل للقراءة فقط في طبقة التطبيق أو العرض، مع الحفاظ على قاعدة بياناتك محايدة المنطقة الزمنية وقابلة للنقل.

تم اختيار عصر Unix في 1 يناير 1970 من قبل مطوري Unix الأوائل كنقطة مرجعية مريحة وحديثة. لم يكن متطلباً تقنياً بل قرار عملي اتُخذ في أوائل السبعينيات عندما كان Unix يُطور في مختبرات Bell. أصبح التاريخ منذ ذلك الحين المعيار العالمي لقياس الوقت في الحاسوب.