العمل مع الطوابع الزمنية لنظام Unix في لغات البرمجة
لماذا الطوابع الزمنية لنظام Unix في البرمجة؟
الطوابع الزمنية لنظام Unix هي العملة العالمية للوقت في البرمجيات. إنها تجعل الحسابات التاريخية بسيطة (مجرد إضافة أو طرح ثواني)، وتزيل ارتباك المناطق الزمنية، وتتسلسل بشكل نظيف إلى JSON. توفر كل لغة برمجة وظائف مباشرة للعمل معها، لكن واجهات API تختلف قليلاً. يغطي هذا الدليل اللغات الأكثر شيوعًا وأفضل ممارساتها.
JavaScript (المتصفح و Node.js)
تستخدم JavaScript الميلي ثانية لكائن Date الخاص بها، بينما تستخدم معظم الأنظمة الأخرى الثواني. هذا هو المصدر الأكثر شيوعًا للأخطاء.
الحصول على الطابع الزمني الحالي
// الميلي ثانية منذ العصر (JavaScript القياسية)
const nowMs = Date.now(); // 1785292800000
// الثواني منذ العصر (للتوافق)
const nowSec = Math.floor(Date.now() / 1000); // 1785292800
// مؤقت Node.js عالي الدقة (ميكروثانية)
const hrTime = process.hrtime.bigint();
تحويل طابع زمني إلى تاريخ
// من الثواني (معظم واجهات API وقواعد البيانات)
const timestamp = 1785292800;
const date = new Date(timestamp * 1000); // اضرب في 1000!
// من الميلي ثانية (JavaScript الأصلية)
const dateFromMs = new Date(1785292800000);
// تنسيق النتيجة
console.log(date.toISOString());
// الناتج: 2026-07-19T00:00:00.000Z
console.log(date.toLocaleString("en-US", { timeZone: "America/New_York" }));
// الناتج: 7/18/2026, 8:00:00 PM
تحليل سلسلة تاريخ إلى طابع زمني
// استخدام Date.parse() (ترجع ميلي ثانية)
const ms = Date.parse("2026-07-19T00:00:00Z");
const sec = ms / 1000; // 1785292800
// استخدام منشئ Date
const ts = Math.floor(new Date("2026-07-19 UTC").getTime() / 1000);
تحذير: يختلف سلوك Date.parse() عبر المتصفحات لسلاسل التاريخ غير القياسية. استخدام تنسيق ISO 8601 مع محدد المنطقة الزمنية (Z لـ UTC) هو الأكثر أمانًا.
العمل مع المناطق الزمنية في JavaScript
// تنسيق في منطقة زمنية محددة
const date = new Date(1785292800 * 1000);
const options = {
timeZone: "Asia/Tokyo",
year: "numeric", month: "2-digit", day: "2-digit",
hour: "2-digit", minute: "2-digit", second: "2-digit",
};
console.log(date.toLocaleString("ja-JP", options));
// الناتج: 07/19/2026 09:00:00
للعمليات المتقدمة مع المناطق الزمنية، يوصى باستخدام واجهة Intl.DateTimeFormat أو مكتبات مثل date-fns-tz و Luxon.
Python
توفر Python وحدات منخفضة المستوى (time) وعالية المستوى (datetime) للعمل مع الطوابع الزمنية.
الحصول على الطابع الزمني الحالي
import time
# الثواني كعدد عشري (بما في ذلك الميلي ثانية الكسرية)
current = time.time()
# مثال: 1785292800.123456
# كعدد صحيح
current_int = int(time.time())
تحويل طابع زمني إلى تاريخ ووقت
from datetime import datetime
# تاريخ ووقت UTC (Python 3.x)
dt_utc = datetime.utcfromtimestamp(1785292800)
# تاريخ ووقت مراعٍ للمنطقة الزمنية (Python 3.9+ مع zoneinfo)
from zoneinfo import ZoneInfo
dt_tokyo = datetime.fromtimestamp(1785292800, tz=ZoneInfo("Asia/Tokyo"))
# سلسلة منسقة
print(dt_utc.strftime("%Y-%m-%d %H:%M:%S"))
# الناتج: 2026-07-19 00:00:00
تحليل سلسلة تاريخ إلى طابع زمني
import time
from datetime import datetime
# من سلسلة تاريخ
dt = datetime.strptime("2026-07-19 00:00:00", "%Y-%m-%d %H:%M:%S")
timestamp = time.mktime(dt.timetuple()) # يعامل كتوقيت محلي
# لإدخال UTC
from datetime import timezone
timestamp_utc = dt.replace(tzinfo=timezone.utc).timestamp()
العمل مع Pandas (تحليل البيانات)
import pandas as pd
# تحويل عمود من الطوابع الزمنية لنظام Unix إلى تاريخ ووقت
df["timestamp"] = pd.to_datetime(df["unix_seconds"], unit="s")
# التحويل إلى وحدات مختلفة
df["datetime_ms"] = pd.to_datetime(df["unix_milliseconds"], unit="ms")
# تعيين منطقة زمنية
df["timestamp_ny"] = df["timestamp"].dt.tz_localize("UTC").dt.tz_convert("America/New_York")
PHP
تمتلك PHP أبسط واجهة API لعمليات الطوابع الزمنية.
الحصول على الطابع الزمني الحالي
<?php
$now = time(); // عدد صحيح: 1785292800
$nowMicro = microtime(); // سلسلة: "0.12345600 1785292800"
$nowFloat = microtime(true); // عدد عشري: 1785292800.1235
تحويل طابع زمني إلى تاريخ
<?php
echo date("Y-m-d H:i:s", 1785292800);
// الناتج: 2026-07-19 00:00:00
// مع المنطقة الزمنية
$tz = new DateTimeZone("Europe/London");
$dt = new DateTime("@1785292800");
$dt->setTimezone($tz);
echo $dt->format("Y-m-d H:i:s");
Go
حزمة time في Go مصممة بشكل جيد ولكنها تتطلب فهمًا صريحًا للأنواع المعنية.
الحصول على الطابع الزمني الحالي
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
sec := now.Unix() // int64 ثواني
milli := now.UnixMilli() // int64 ميلي ثانية
nano := now.UnixNano() // int64 نانوثانية
fmt.Printf("Seconds: %d\n", sec)
}
تحويل طابع زمني إلى تاريخ
t := time.Unix(1785292800, 0)
fmt.Println(t.UTC())
// الناتج: 2026-07-19 00:00:00 +0000 UTC
// تنسيق كسلسلة
fmt.Println(t.Format("2006-01-02 15:04:05"))
// الناتج: 2026-07-19 00:00:00
// مع المنطقة الزمنية
loc, _ := time.LoadLocation("America/Chicago")
fmt.Println(t.In(loc))
Rust
use std::time::{SystemTime, UNIX_EPOCH};
// الطابع الزمني الحالي
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("Time went backwards");
println!("Seconds: {}", now.as_secs());
// طابع زمني إلى تاريخ
let dt = chrono::NaiveDateTime::from_timestamp_opt(1785292800, 0).unwrap();
println!("{}", dt.format("%Y-%m-%d %H:%M:%S"));
تخزين قواعد البيانات: أفضل الممارسات
اختيار نوع العمود المناسب
| قاعدة البيانات | النوع الموصى به | ملاحظات |
|----------|-----------------|-------|
| PostgreSQL | TIMESTAMP WITH TIME ZONE أو BIGINT | نوع الطابع الزمني الأصلي مفضل |
| MySQL / MariaDB | INT UNSIGNED (للتواريخ حتى 2106) أو BIGINT | تجنب نوع TIMESTAMP (ينتهي نطاقه عند 2038) |
| SQLite | INTEGER | SQLite ليس لديها نوع طابع زمني أصلي |
| MongoDB | كائن Date أو int64 | BSON Date هو داخليًا طابع زمني 64 بت |
مثال PostgreSQL
-- تخزين كطابع زمني أصلي
CREATE TABLE events (
id SERIAL PRIMARY KEY,
occurred_at TIMESTAMP WITH TIME ZONE NOT NULL,
payload JSONB
);
-- إدراج مع الوقت الحالي
INSERT INTO events (occurred_at) VALUES (NOW());
-- استعلام كطابع زمني لنظام Unix
SELECT EXTRACT(EPOCH FROM occurred_at) AS unix_ts FROM events;
مثال MySQL
-- استخدام BIGINT للتخزين المضمون للمستقبل
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
event_time BIGINT NOT NULL,
message TEXT
);
-- إدراج الطابع الزمني الحالي
INSERT INTO logs (event_time, message) VALUES (UNIX_TIMESTAMP(), 'Server started');
-- استعلام وتحويل
SELECT FROM_UNIXTIME(event_time) AS readable_time FROM logs;
جدول مقارنة اللغات
| اللغة | الطابع الزمني الحالي | طابع زمني إلى تاريخ | تاريخ إلى طابع زمني | الدقة |
|----------|-------------------|-------------------|-------------------|------------|
| JavaScript | Date.now() | new Date(ts * 1000) | Date.parse(str) / 1000 | ميلي ثانية |
| Python | time.time() | datetime.fromtimestamp(ts) | datetime.strptime(str).timestamp() | ثواني عشرية |
| PHP | time() | date("Y-m-d", ts) | strtotime(str) | ثواني |
| Go | time.Now().Unix() | time.Unix(ts, 0) | time.Parse(layout, str).Unix() | ثواني |
| Rust | SystemTime::now() | NaiveDateTime::from_timestamp_opt() | — | متنوعة |
أيًا كانت اللغة التي تستخدمها، فإن محول الطابع الزمني لنظام Unix هو رفيق موثوق للفحوصات السريعة وتصحيح الأخطاء.