الوقت الإيبوك: أساس الطوابع الزمنية في يونكس

ما هو بالضبط وقت الإيبوك (Epoch Time)؟

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

وقت Unix epoch (يُسمى أيضاً وقت Unix، أو وقت POSIX، أو ببساطة "epoch") يمثل لحظة واحدة في الوقت كعدد الثواني التي مرت منذ 1 يناير 1970، عند منتصف الليل بتوقيت UTC (التوقيت العالمي المنسق). هذه اللحظة المحددة تُعرف باسم "Unix epoch" أو "epoch zero".

مثال سريع: إذا كان الطابع الزمني الحالي لـ Unix هو 1728773400، فهذا يعني أن 1,728,773,400 ثانية بالضبط قد مرت منذ منتصف ليل 1 يناير 1970.

لماذا 1 يناير 1970؟

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

فهم التنسيق

تأتي الطوابع الزمنية لـ Unix بتنسيقات مختلفة حسب الدقة المطلوبة:

  • الثواني (10 أرقام): التنسيق القياسي، مثل 1728773400
  • الميلي ثانية (13 رقماً): لمزيد من الدقة، مثل 1728773400000
  • الميكرو ثانية (16 رقماً): للتوقيت فائق الدقة، مثل 1728773400000000

الفترات الزمنية الشائعة بالثواني

فهم هذه الفترات الشائعة يمكن أن يساعدك في العمل مع الطوابع الزمنية بشكل أكثر سهولة:

الفترة الزمنية الثواني الحساب السريع
ساعة واحدة 3,600 60 × 60
يوم واحد 86,400 24 × 3,600
أسبوع واحد 604,800 7 × 86,400
شهر واحد (متوسط) 2,629,743 30.44 × 86,400
سنة واحدة (متوسط) 31,556,926 365.24 × 86,400

مشكلة عام 2038 (Y2038)

إليك شيء مهم: العديد من الأنظمة تخزن الطوابع الزمنية لـ Unix كـ عدد صحيح موقّع 32 بت. هذا يخلق مشكلة مشابهة لخطأ Y2K.

يمكن للعدد الصحيح الموقّع 32 بت أن يعد فقط حتى 2,147,483,647 ثانية. بمجرد وصولنا إلى 19 يناير 2038، عند الساعة 03:14:07 بتوقيت UTC، سيفيض هذا العداد ويعود إلى رقم سالب، مما قد يتسبب في فشل النظام وأخطاء.

مهم: تنتقل الأنظمة الحديثة إلى الطوابع الزمنية 64 بت، والتي لن تفيض لمدة 292 مليار سنة أخرى. تأكد من أن تطبيقاتك تستخدم أعداد صحيحة 64 بت لتخزين الطوابع الزمنية!

الحصول على وقت Epoch الحالي

كل لغة برمجة لها طريقتها الخاصة للحصول على الطابع الزمني الحالي لـ Unix. إليك الطرق الأكثر شيوعاً:

تطوير الويب

JavaScript

// احصل على الطابع الزمني بالميلي ثانية، اقسم على 1000 للحصول على الثواني
const timestamp = Math.floor(Date.now() / 1000);

// طريقة بديلة
const timestamp = Math.floor(new Date().getTime() / 1000);

PHP

// بسيط ومباشر
$timestamp = time();

// استخدام DateTime (أكثر مرونة)
$timestamp = (new DateTime())->getTimestamp();

لغات الخادم (Backend)

Python

import time

# احصل على الطابع الزمني الحالي
timestamp = int(time.time())

# استخدام وحدة datetime
from datetime import datetime
timestamp = int(datetime.now().timestamp())

Java

// يعيد الميلي ثانية، اقسم على 1000 للحصول على الثواني
long timestamp = System.currentTimeMillis() / 1000;

// استخدام Instant (Java 8+)
long timestamp = Instant.now().getEpochSecond();

C#

// .NET Framework 4.6+ / .NET Core
long timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();

// الإصدارات القديمة
var epoch = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;

Ruby

# احصل على الطابع الزمني الحالي
timestamp = Time.now.to_i

# بديل
timestamp = Time.new.to_i

Go

import "time"

// احصل على الطابع الزمني الحالي لـ Unix
timestamp := time.Now().Unix()

// للميلي ثانية
milliseconds := time.Now().UnixMilli()

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

MySQL

-- احصل على الطابع الزمني الحالي
SELECT UNIX_TIMESTAMP();

-- احصل على الطابع الزمني من تاريخ محدد
SELECT UNIX_TIMESTAMP('2025-10-12 14:30:00');

PostgreSQL

-- احصل على الطابع الزمني الحالي
SELECT EXTRACT(EPOCH FROM NOW());

-- من تاريخ محدد
SELECT EXTRACT(EPOCH FROM TIMESTAMP '2025-10-12 14:30:00');

SQLite

-- احصل على الطابع الزمني الحالي
SELECT STRFTIME('%s', 'now');

-- من تاريخ محدد
SELECT STRFTIME('%s', '2025-10-12 14:30:00');

سطر الأوامر

Unix/Linux Shell

# احصل على الطابع الزمني الحالي
date +%s

# حوّل تاريخاً محدداً إلى طابع زمني
date +%s -d "2025-10-12 14:30:00"

# لوقت UTC/GMT، استخدم -ud بدلاً من -d
date +%s -ud "2025-10-12 14:30:00"

PowerShell

# احصل على الطابع الزمني الحالي
[int][double]::Parse((Get-Date (Get-Date).ToUniversalTime() -UFormat %s))

التحويل من Epoch إلى تاريخ قابل للقراءة

بمجرد حصولك على طابع زمني لـ Unix، ستحتاج غالباً إلى تحويله مرة أخرى إلى تنسيق تاريخ قابل للقراءة:

JavaScript

// حوّل الطابع الزمني إلى كائن Date
const date = new Date(timestamp * 1000); // اضرب في 1000 للحصول على الميلي ثانية

// قم بتنسيقه
console.log(date.toLocaleString()); // التنسيق المحلي
console.log(date.toISOString());    // تنسيق ISO 8601

PHP

// تنسيق الطابع الزمني
$date = date('Y-m-d H:i:s', $timestamp);

// تنسيق RFC 2822
$date = date('r', $timestamp);

// استخدام DateTime
$date = (new DateTime())->setTimestamp($timestamp)->format('Y-m-d H:i:s');

Python

from datetime import datetime

# حوّل إلى كائن datetime
dt = datetime.fromtimestamp(timestamp)

# قم بتنسيقه
formatted = dt.strftime('%Y-%m-%d %H:%M:%S')

# لـ UTC
dt_utc = datetime.utcfromtimestamp(timestamp)

MySQL

-- حوّل الطابع الزمني إلى datetime
SELECT FROM_UNIXTIME(1728773400);

-- مع تنسيق مخصص
SELECT FROM_UNIXTIME(1728773400, '%Y-%m-%d %H:%i:%s');

التحويل من تاريخ قابل للقراءة إلى Epoch

العملية المعاكسة مهمة بنفس القدر:

JavaScript

// حلل سلسلة التاريخ إلى طابع زمني
const timestamp = Math.floor(new Date('2025-10-12 14:30:00').getTime() / 1000);

// استخدام Date.parse()
const timestamp = Math.floor(Date.parse('October 12, 2025') / 1000);

PHP

// حلل معظم نصوص التاريخ الإنجليزية
$timestamp = strtotime('15 November 2025');
$timestamp = strtotime('next Monday');
$timestamp = strtotime('+1 week');

// استخدام DateTime
$timestamp = (new DateTime('2025-10-12 14:30:00'))->getTimestamp();

Python

from datetime import datetime
import time

# حلل سلسلة التاريخ
dt = datetime.strptime('2025-10-12 14:30:00', '%Y-%m-%d %H:%M:%S')
timestamp = int(dt.timestamp())

# لـ UTC
import calendar
timestamp = calendar.timegm(time.strptime('2025-10-12 14:30:00', '%Y-%m-%d %H:%M:%S'))

أفضل الممارسات

عند العمل مع الطوابع الزمنية لـ Unix في تطبيقاتك:

  • استخدم دائماً أعداد صحيحة 64 بت لتجنب مشكلة Y2038
  • خزّن الطوابع الزمنية بتوقيت UTC في قاعدة البيانات، حوّل إلى التوقيت المحلي فقط للعرض
  • كن متسقاً مع دقتك (ثواني مقابل ميلي ثانية) في جميع أنحاء تطبيقك
  • وثّق تنسيقك – اجعل من الواضح ما إذا كنت تستخدم الثواني أو الميلي ثانية
  • فكّر في المكتبات الواعية بالمنطقة الزمنية لعمليات التاريخ/الوقت المعقدة
  • لا تخزّن أبداً الوقت المحلي كطابع زمني بدون معلومات المنطقة الزمنية

الخلاصة

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

سواء كنت تبني تطبيق ويب، أو تعمل مع قواعد البيانات، أو تحتاج فقط إلى جدولة المهام، فإن فهم وقت epoch سيجعل حياتك أسهل بكثير. استخدم أداة محول الطابع الزمني لـ Unix الخاصة بنا لتحويل سريع بين الطوابع الزمنية والتواريخ القابلة للقراءة!

جرّبها الآن: توجه إلى أداة المحول الخاصة بنا للتدرب على العمل مع الطوابع الزمنية لـ Unix في الوقت الفعلي!