🕐
← Назад к руководствам

Как преобразовать несколько 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
}

Использование:

./batch-convert.awk server.log

Метод 6: Использование SQL для меток времени в базе данных

Если ваши метки времени находятся в базе данных, позвольте SQL сделать всю работу:

PostgreSQL

SELECT 
    id,
    event_time,
    to_timestamp(event_time) AS readable_time,
    to_char(to_timestamp(event_time), 'YYYY-MM-DD HH24:MI:SS') AS formatted_time
FROM events
WHERE to_timestamp(event_time) >= '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-времени. Для автоматизации и больших наборов данных автоматизируйте преобразование с помощью программного подхода, соответствующего вашему рабочему процессу.