BASH преобразование даты

unix_time timeshtamp date dateformat

Мне нужна команда оболочки или script, которая преобразует временную метку Unix в дату. Ввод может поступать либо из первого параметра, либо из stdin, что позволяет использовать следующие шаблоны использования:

ts2date 1267619929

и

echo 1267619929 | ts2date

Обе команды должны вывести “Wed Mar 3 13:38:49 2010”.

В более поздних версиях распространенных дистрибутивов Linux вы можете использовать:

date -d @1267619929
452  a'r 03 марта '10 в 15:47

Эта версия устраняет необходимость в внешних tty и cat.
Он использует date, но может так же легко использовать gawk.
Вы можете изменить shebang и заменить двойные квадратные скобки одиночными, и это также будет работать в sh.

#!/bin/bash
LANG=C
if [[ -z "$1" ]]
then
    if [[ -p /dev/stdin ]]    # input from a pipe
    then
        read -r p
    else
        echo "No timestamp given." >&2
        exit
    fielse
    p=$1fi
date -d "@$p" +%c

Вы можете использовать дату GNU, например,

$ sec=1267619929$ date -d "UTC 1970-01-01 $sec secs"

или

$ date -ud @1267619929
16  ghostdog74 03 марта '10 в 15:51

Вы можете использовать этот простой awk script:

#!/bin/gawk -f   
{ print strftime("%c", $0); }

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

$ echo '1098181096' | ./a.awk
Tue 19 Oct 2004 03:18:16 AM PDT

Просмотр файлов журнала или их мониторинга:

tail -f <log file> | gawk '{ printf strftime("%c", $1); for (i=2; i<NF; i++) printf $i " "; print $NF }'

Cлегка его модифицирую, чтобы увеличить скорость при переполнении столбца многих временных меток на script.   Например, прокладка 1000 временных меток к исходному script с xargs -n1 на моей машине заняла 6.929s вместо 0.027 с этой модифицированной версией:

#!/bin/bash
LANG=C
if [[ -z "$1" ]]
then
    if [[ -p /dev/stdin ]]    # input from a pipe
    then
        cat - | gawk '{ print strftime("%c", $1); }'
    else
        echo "No timestamp given." >&2
        exit
    fielse
    date -d @$1 +%c
fi

script, который делает это сам:

#!/bin/bash
LANG=C
if [ -z "$1" ]; then
    if [  "$(tty)" = "not a tty" ]; then
            p=`cat`;
    else
            echo "No timestamp given."
            exit
    fielse
    p=$1fiecho $p | gawk '{ print strftime("%c", $0); }'

В Bash версии старше 4.2, можно использовать формат printf %(datefmt)T:

$ printf '%(%c)T\n' 1267619929
Wed 03 Mar 2010 01:38:49 PM CET

Это хорошо, потому что это оболочка встроена. Формат datefmt - это строка, принятая strftime(3) (см. man 3 strftime).
Здесь %c:

%c Предпочтительное представление даты и времени для текущего локали.

Теперь, если вы хотите, чтобы script принимал аргумент и, если ни один не был предоставлен, читает stdin, вы можете действовать как:

#!/bin/bash
if (($#)); then
    printf '%(%c)T\n' "$@"else
    while read -r line; do
        printf '%(%c)T\n' "$line"
    done
fi

В OSX или BSD есть эквивалентный флаг -r, который, по-видимому, занимает временную метку unix. 

Здесь пример, который запускает дату четыре раза: один раз для первой даты, чтобы показать, что это такое;
один для преобразования в временную метку unix с %s и, наконец, тот, который с -r преобразует то, что %s возвращает к строке.

$  date; date +%s; date -r `date +%s`
Tue Oct 24 16:27:42 CDT 20171508880462
Tue Oct 24 16:27:42 CDT 2017

Пример:

$ date
Tue Mar 22 16:47:06 CST 2016

$ date -d "Tue Mar 22 16:47:06 CST 2016" "+%s"
1458636426

$ date +%s
1458636453

$ date -d @1458636426
Tue Mar 22 16:47:06 CST 2016

$ date --date='@1458636426'
Tue Mar 22 16:47:06 CST 2016

Вы можете получить отформатированную дату из отметки времени следующим образом

date +'%Y-%m-%d %H:%M:%S' -d "@timestamp"

В PHP

$unix_time = 1256571985;
echo date("Y-m-d H:i:s",$unix_time)