🕐
← العودة للأدلة

كيفية تحويل طوابع زمنية متعددة لنظام Unix دفعة واحدة

· وسوم: batch-processing, log-analysis, automation, unix-timestamp, shell-scripting, data-processing

لماذا التحويل الدفعي للطوابع الزمنية؟

عندما تعمل مع سجلات الخادم أو تصديرات قواعد البيانات أو استجابات API أو مجموعات بيانات التحليلات، نادرًا ما تواجه طابعًا زمنيًا واحدًا في كل مرة. البيانات الواقعية غالبًا ما تحتوي على آلاف أو ملايين الطوابع الزمنية لنظام Unix موزعة عبر الملفات أو الأعمدة أو حمولات JSON. التحويل اليدوي لكل منها غير عملي. المعالجة الدفعية تحوّل جبال الأرقام الخام إلى جداول زمنية قابلة للقراءة.

يغطي هذا الدليل الأساليب العملية لتحويل الطوابع الزمنية المتعددة باستخدام أدوات سطر الأوامر والنصوص البرمجية وأداتنا عبر الإنترنت.

الطريقة 1: استخدام المحول الدفعي عبر الإنترنت

يدعم محول الطابع الزمني لنظام Unix الإدخال الدفعي. الصق طوابع زمنية متعددة (واحد لكل سطر أو مفصولة بفواصل) وتحولها الأداة كلها مرة واحدة، مع عرض النتائج في جدول مرتب حسب المنطقة الزمنية.

هذا مثالي للدفعات متوسطة الحجم — عشرات إلى مئات الطوابع الزمنية — حيث تحتاج إلى نتيجة سريعة ومرئية بدون كتابة كود.

الطريقة 2: المعالجة الدفعية بسطر الأوامر

حلقة أساسية مع أمر date

# تحويل قائمة من الطوابع الزمنية باستخدام حلقة bash
for ts in 1785292800 1785379200 1785465600 1785552000; do
    date -d @"$ts" "+%Y-%m-%d %H:%M:%S"
done

القراءة من ملف

# timestamps.txt يحتوي على طابع زمني واحد لكل سطر
while read -r ts; do
    date -d @"$ts" "+%Y-%m-%d %H:%M:%S"
done < timestamps.txt

استخدام xargs للمعالجة المتوازية

# للملفات الكبيرة، استخدم xargs مع عمليات متعددة
cat timestamps.txt | xargs -P 4 -I {} date -d "@{}" "+%Y-%m-%d %H:%M:%S"

الإخراج إلى ملف CSV

# إنشاء CSV مع الطابع الزمني الأصلي والتاريخ المحول
echo "timestamp,date_utc,date_local" > output.csv
while read -r ts; do
    utc_date=$(TZ=UTC date -d @"$ts" "+%Y-%m-%d %H:%M:%S")
    local_date=$(date -d @"$ts" "+%Y-%m-%d %H:%M:%S")
    echo "$ts,$utc_date,$local_date" >> output.csv
done < timestamps.txt

الطريقة 3: استخراج الطوابع الزمنية من ملفات السجلات

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

سجلات وصول Apache / Nginx

غالبًا ما تستخدم سجلات Apache و Nginx تنسيق %{%Y-%m-%d}T أو، إذا تم تكوينها، الطوابع الزمنية لنظام Unix:

# استخراج وتحويل الطوابع الزمنية من سجل Nginx
# قد تحتوي أسطر السجل على: [1785292800] GET /index.html 200
grep -oP '\[\K[0-9]{10}(?=\])' access.log | while read -r ts; do
    date -d @"$ts" "+%Y-%m-%d %H:%M:%S"
done

سجلات JSON

غالبًا ما تسجل التطبيقات الحديثة بتنسيق JSON:

# استخدام jq لاستخراج الطوابع الزمنية من ملف سجل JSON
cat app.log | jq -r '.timestamp' | while read -r ts; do
    date -d @"$ts" "+%Y-%m-%d %H:%M:%S"
done

السجلات المحددة المخصصة

# إذا كانت الطوابع الزمنية هي الحقل الأول في السجل (مفصولة بـ |)
awk -F'|' '{ts=$1; cmd="date -d @" ts " \"+%Y-%m-%d %H:%M:%S\""; cmd | getline date; close(cmd); print date, $0}' server.log

الطريقة 4: استخدام Python للمعالجة الدفعية المتقدمة

Python هي الأداة الأكثر مرونة للتحويل الدفعي، خاصة عندما تحتاج الطوابع الزمنية إلى تصفية أو تحويل أو تصدير.

تحويل قائمة من الطوابع الزمنية

from datetime import datetime
import json

timestamps = [1785292800, 1785379200, 1785465600, 1785552000]

results = []
for ts in timestamps:
    dt = datetime.utcfromtimestamp(ts)
    results.append({
        "timestamp": ts,
        "datetime_utc": dt.strftime("%Y-%m-%d %H:%M:%S"),
        "date": dt.strftime("%Y-%m-%d"),
        "time": dt.strftime("%H:%M:%S"),
        "day_of_week": dt.strftime("%A"),
    })

print(json.dumps(results, indent=2))

معالجة ملف CSV

import csv
from datetime import datetime

with open("data.csv", "r") as infile, open("converted.csv", "w", newline="") as outfile:
    reader = csv.DictReader(infile)
    writer = csv.DictWriter(outfile, fieldnames=reader.fieldnames + ["date_utc", "date_local"])
    writer.writeheader()
    
    for row in reader:
        ts = int(row["timestamp"])
        dt_utc = datetime.utcfromtimestamp(ts)
        row["date_utc"] = dt_utc.strftime("%Y-%m-%d %H:%M:%S")
        
        # يمكنك استبدال هذا بمنطقتك الزمنية المحلية
        from datetime import timezone
        dt_local = datetime.fromtimestamp(ts, tz=timezone.utc).astimezone()
        row["date_local"] = dt_local.strftime("%Y-%m-%d %H:%M:%S %Z")
        
        writer.writerow(row)

print("Conversion complete. Output written to converted.csv")

التصفية حسب نطاق التاريخ

from datetime import datetime

# تعريف النطاق: بداية ونهاية يوليو 2026
start_ts = int(datetime(2026, 7, 1).timestamp())
end_ts   = int(datetime(2026, 7, 31, 23, 59, 59).timestamp())

timestamps = [1785292800, 1785379200, 1785465600, 1785552000,
              1234567890, 1000000000]

# تصفية ليوليو 2026 فقط
july_only = [ts for ts in timestamps if start_ts <= ts <= end_ts]

for ts in july_only:
    dt = datetime.utcfromtimestamp(ts)
    print(f"{ts} -> {dt.strftime('%Y-%m-%d %H:%M:%S')}")

الطريقة 5: استخدام awk للتحويل المتدفق

للملفات الكبيرة جدًا (ملايين الصفوف)، يعالج awk البيانات كتدفق دون تحميل كل شيء في الذاكرة:

#!/usr/bin/awk -f
# batch-convert.awk
# يحول الحقل الأول كطابع زمني لنظام Unix، ويطبع جميع الحقول مع التاريخ

{
    ts = $1
    # mktime في awk يتوقع "YYYY MM DD HH MM SS"
    # نستدعي الصدفة للتحويل عبر أمر date
    cmd = "date -d @" ts " \"+%Y-%m-%d %H:%M:%S\""
    cmd | getline date
    close(cmd)
    print date, $0
}

الطريقة 6: التحويل مباشرة في SQL

بالنسبة للطوابع الزمنية الموجودة بالفعل في قاعدة البيانات، قم بتحويلها في الاستعلام:

PostgreSQL

SELECT 
    id,
    EXTRACT(EPOCH FROM occurred_at)::BIGINT AS unix_timestamp,
    occurred_at AS readable_time,
    to_char(occurred_at, 'YYYY-MM-DD HH24:MI:SS') AS formatted_time
FROM events
WHERE occurred_at >= '2026-07-01';

MySQL

SELECT 
    id,
    event_time,
    FROM_UNIXTIME(event_time) AS readable_time,
    FROM_UNIXTIME(event_time, '%Y-%m-%d %H:%i:%s') AS formatted_time
FROM events
WHERE FROM_UNIXTIME(event_time) >= '2026-07-01';

SQLite

SELECT 
    id,
    event_time,
    datetime(event_time, 'unixepoch') AS readable_time,
    strftime('%Y-%m-%d %H:%M:%S', event_time, 'unixepoch') AS formatted_time
FROM events;

تنسيق جداول الإخراج

# إنشاء جدول منسق بشكل جميل مع رؤوس الأعمدة
convert() {
    printf "%-15s %-25s %-25s\n" "TIMESTAMP" "UTC" "LOCAL"
    printf "%-15s %-25s %-25s\n" "---------------" "-------------------------" "-------------------------"
    while read -r ts; do
        utc=$(TZ=UTC date -d @"$ts" "+%Y-%m-%d %H:%M:%S")
        local=$(date -d @"$ts" "+%Y-%m-%d %H:%M:%S")
        printf "%-15s %-25s %-25s\n" "$ts" "$utc" "$local"
    done <<< "$(cat "$1")"
}

مقارنة الأداء

| الطريقة | الأنسب لـ | السرعة (10K طابع زمني) | التعقيد | |--------|----------|----------------------|------------| | المحول عبر الإنترنت | دفعات صغيرة (< 50) | فوري | لا شيء | | حلقة Bash | صغير-متوسط (50-10K) | ~30ث | منخفض | | xargs متوازي | متوسط (10K-100K) | ~10ث | منخفض | | Python | أي حجم | ~2ث | متوسط | | تدفق awk | كبير جدًا (ملايين) | ~5ث | متوسط | | SQL | بيانات قاعدة البيانات | فوري | منخفض |

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