Skip to content
العودة إلى المدوّنة
دروس تعليمية

دليل طابع Unix الزمني: الدقة، المنطقة الزمنية ونصائح التوقيت الصيفي

شرح طوابع Unix الزمنية: أصول epoch، تحويل الثواني/الملي ثانية/المايكروثانية، التعامل مع المناطق الزمنية، مزالق التوقيت الصيفي، وأمثلة بلغات JavaScript وPython وGo.

١٤ دقيقة قراءة

الدليل الشامل لطابع Unix الزمني: تحويل الثواني/الملي ثانية/المايكروثانية وأفضل ممارسات المناطق الزمنية

تمثل طوابع Unix الزمنية الوقت كـ “المدة المنقضية منذ حقبة Unix (الأول من يناير 1970، 00:00:00 UTC).” أكثر من 95% من خوادم الويب و90% من أنظمة قواعد البيانات عالميًا تستخدم هذا التمثيل داخليًا. يغطي هذا الدليل اختلافات الدقة، وتطبيقات لغات البرمجة، والتعامل مع المناطق الزمنية، واعتبارات التوقيت الصيفي.

أصول وتعريف طابع Unix الزمني

بدأت حقبة Unix في الأول من يناير 1970، 00:00:00 UTC. الطابع الزمني 0 يقابل هذه اللحظة، بينما 1262304000 يمثل 2010-01-01 00:00:00 UTC. يتجاهل النظام تأثيرات الثواني الكبيسة افتراضيًا.

كانت تُخزّن أصلًا كأعداد صحيحة موقّعة بـ 32 بت، مما أنشأ مشكلة عام 2038 — تفيض القيمة القصوى في 19 يناير 2038، 03:14:07 UTC. تستخدم الأنظمة الحديثة أعدادًا صحيحة بـ 64 بت، مما يمدد النطاق الزمني القابل للتمثيل بشكل كبير.

اختلافات دقة الوقت

الوحدةالعدد في الثانيةالأرقامالتطبيقات النموذجية
ثوانٍ (s)110أنظمة Unix/Linux التقليدية
ملي ثانية (ms)1,00013JavaScript، Java، السجلات
مايكروثانية (μs)1,000,00016التتبع الموزع، قواعد البيانات
نانوثانية (ns)1,000,000,00019لغة Go، تحليل الأداء

قاعدة عملية: الطوابع الزمنية ذات 10 أرقام تمثل عمومًا ثوانٍ، و13 رقمًا تمثل ملي ثانية، و16 رقمًا تمثل مايكروثانية، و19 رقمًا تمثل نانوثانية.

طوابع JavaScript الزمنية

يستخدم JavaScript الملي ثانية أصلًا. يفترض مُنشئ Date() أن الأرقام المدخلة بالملي ثانية — للطوابع الزمنية بالثواني، اضرب في 1000.

// Get current Unix timestamp (in milliseconds)
const timestampMs = Date.now();
console.log(timestampMs);  // Example output: 1692268800123

// For second-level timestamps, divide milliseconds by 1000 and round down
const timestampSec = Math.floor(Date.now() / 1000);
console.log(timestampSec); // Example output: 1692268800

// Convert Unix timestamp back to Date object
let ts = 1692268800;
let date = new Date(ts * 1000);
console.log(date.toISOString()); // "2023-08-17T16:00:00.000Z"

طوابع Python الزمنية

تعيد time.time() في Python طوابع Unix الزمنية بالثواني كقيم عشرية:

import time
from datetime import datetime, timezone

# Get current Unix timestamp (seconds, float)
now_sec = time.time()
print(now_sec)  # Example output: 1692268800.123456

# Get milliseconds (integer)
now_millis = int(time.time() * 1000)
print(now_millis)  # Example: 1692268800123

# Get nanoseconds (Python 3.7+)
now_nanos = time.time_ns()
print(now_nanos)  # Example: 1692268800123456789

# Convert to datetime
ts = 1692268800
dt_local = datetime.fromtimestamp(ts)
dt_utc = datetime.fromtimestamp(ts, timezone.utc)
print(dt_local.strftime("%Y-%m-%d %H:%M:%S"))  # Local time
print(dt_utc.strftime("%Y-%m-%d %H:%M:%S"))    # UTC time

طوابع لغة Go الزمنية

توفر مكتبة time في Go مستويات دقة متعددة:

package main

import (
    "fmt"
    "time"
)

func main() {
    // Get current Unix timestamp
    sec := time.Now().Unix()        // Seconds
    msec := time.Now().UnixMilli()  // Milliseconds (Go 1.17+)
    nsec := time.Now().UnixNano()   // Nanoseconds

    fmt.Println(sec)   // Example: 1692268800
    fmt.Println(msec)  // Example: 1692268800123
    fmt.Println(nsec)  // Example: 1692268800123456789

    // Convert timestamp to Time object
    t := time.Unix(sec, 0)
    fmt.Println(t.UTC())
    fmt.Println(t)
}

الأخطاء الشائعة وأفضل الممارسات

مثال على خطأ: وحدات غير واضحة

// ✗ Wrong: unclear timestamp unit
const timestamp = 1692268800;
const date = new Date(timestamp); // Error: treated as milliseconds, shows 1970

// ✓ Correct: clearly indicate units
const timestampSec = 1692268800;
const timestampMs = 1692268800000;
const dateFromSec = new Date(timestampSec * 1000);

أفضل ممارسات تسمية الحقول

log_entry = {
    "timestamp_ms": 1692268800123,           # Millisecond-level
    "timestamp_iso": "2023-08-17T16:00:00Z", # ISO 8601 UTC
    "event_type": "user_login",
    "user_id": 12345
}

مزالق التعامل مع المناطق الزمنية

هناك أربعة مزالق رئيسية عند التعامل مع المناطق الزمنية:

  1. الخلط بين التوقيت المحلي وتوقيت UTC — طوابع Unix الزمنية مبنية دائمًا على UTC؛ حوّل إلى التوقيت المحلي فقط عند العرض
  2. عدم حفظ معلومات المنطقة الزمنية — يخلق غموضًا؛ خزّن دائمًا بتوقيت UTC أو أضف الفارق
  3. عدم اتساق المناطق الزمنية بين الأنظمة — يجب أن تستخدم جميع الأنظمة نفس المرجع الزمني (يُنصح بـ UTC)
  4. حساب فروق التوقيت الصيفي يدويًا — اعتمد على المكتبات المدمجة، لا تشفّر القيم يدويًا

النهج الموصى: “تخزين موحد، عرض محلي.” استخدم UTC أو طوابع Unix الزمنية في مراحل التخزين والنقل لضمان الاتساق؛ نسّق وفق المنطقة الزمنية للمستخدم عند العرض.

مشاكل التوقيت الصيفي (DST)

ينشئ التوقيت الصيفي فترتين إشكاليتين:

  • الوقت المحذوف: عند بدء التوقيت الصيفي، تقفز الساعات للأمام. مثلًا، 02:00 تقفز مباشرة إلى 03:00، مما يجعل 02:30 غير موجودة.
  • الوقت المتكرر: عند انتهاء التوقيت الصيفي، تظهر الفترة 01:00–01:59 مرتين، مما يخلق غموضًا.

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

أفضل الممارسات للسجلات وقواعد البيانات وواجهات API

أنظمة السجلات

وحّد منطقة UTC الزمنية + تنسيق ISO 8601؛ أضف طوابع زمنية بالملي ثانية أو بدقة المايكروثانية عند الضرورة.

قواعد البيانات

فضّل الأنواع التقويمية الأصلية مع المنطقة الزمنية؛ استخدم BIGINT للطوابع الزمنية الرقمية مع إشارة واضحة للوحدة في أسماء الحقول (مثل *_epoch_ms).

واجهات API

حدد التنسيقات والوحدات بوضوح. يجب أن تستخدم الواجهات الخارجية ISO 8601 (قابل للقراءة، يتضمن المنطقة الزمنية)؛ يمكن للأنظمة الداخلية استخدام طوابع زمنية رقمية مع وحدات موثقة.

سيناريوهات الأخطاء الشائعة

  • فشل تحليل 13 رقمًا: طوابع الملي ثانية الممررة لدوال تتوقع ثوانٍ تسبب فيضان. حدد الوحدات بعدد الأرقام أولًا.
  • عدم تطابق التنسيقات: تواريخ غير صالحة أو مناطق زمنية مفقودة أو نقاط تبديل التوقيت الصيفي تسبب أخطاء تحليل.
  • فروق المناطق الزمنية: انحرافات بساعات كاملة (±8h) تشير عادة إلى مشاكل توحيد. يُنصح باستخدام UTC داخليًا.
  • فيضان رقمي: أنظمة 32 بت تواجه حدود 2038؛ أعطِ الأولوية للأعداد الصحيحة بـ 64 بت.

الأسئلة الشائعة

لماذا الأول من يناير 1970؟

بدأ تطوير نظام تشغيل Unix في عام 1970، وكان عقدًا مستديرًا — سهل التذكر والحساب. الأعداد الصحيحة بـ 32 بت كانت تستطيع تمثيل التواريخ من 1970 إلى 2038، وهو ما كان كافيًا في ذلك الوقت.

كيف تميّز الثواني عن الملي ثانية؟

ثلاث طرق: تحقق من عدد الأرقام (10 أرقام = ثوانٍ، 13 = ملي ثانية، 16 = مايكروثانية، 19 = نانوثانية)، التحقق بالحساب عبر التحليل والتأكد من المعقولية، أو استخدام أدوات التحويل عبر الإنترنت.

هل مشكلة 2038 لا تزال مهمة؟

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

لماذا يسبب التوقيت الصيفي مشاكل؟

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

لماذا تختلف طوابع JavaScript وPython الزمنية؟

تعيد Date.now() في JavaScript ملي ثانية (13 رقمًا)؛ بينما تعيد time.time() في Python ثوانٍ (عشرية بدقة المايكروثانية). التحويل يتطلب القسمة/الضرب في 1000.

أحدث الاتجاهات والنظرة المستقبلية

  • دقة أعلى: التداول المالي وإنترنت الأشياء والأنظمة الفورية تتطلب دقة بالنانوثانية
  • المزامنة الموزعة: بروتوكولات NTP وPTP تحسّن الدقة
  • طوابع البلوكشين الزمنية: العملات المشفرة تتطلب طوابع زمنية عالية الدقة ومقاومة للتلاعب
  • تحسين الأداء: تعليمات SIMD والتخزين المؤقت في الذاكرة والمعالجة المتوازية تسرّع التحويلات

جرّبه بنفسك

حوّل طوابع Unix الزمنية فوريًا مع محوّل طابع Unix الزمني — يكتشف تلقائيًا الثواني والملي ثانية والمايكروثانية. 100% في متصفحك.

تعمل مع PostgreSQL؟ اقرأ ما الذي يُخزّن فعلًا في عمود timestamp في PostgreSQL؟ لمزالق المناطق الزمنية الخاصة بـ Postgres.

الملخص

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

الطوابع الزمنية ليست إلا جزءًا من أدوات المطور. استكشف المزيد من أدوات المطورين الأساسية للترميز والتجزئة وتحويل البيانات.

مقالات ذات صلة

عرض جميع المقالات