Ответ 1
В более поздних версиях распространенных дистрибутивов Linux вы можете использовать:
date -d @1267619929
Мне нужна команда оболочки или script, которая преобразует временную метку Unix в дату. Ввод может поступать либо из первого параметра, либо из stdin, что позволяет использовать следующие шаблоны использования:
ts2date 1267619929
и
echo 1267619929 | ts2date
Обе команды должны вывести "Wed Mar 3 13:38:49 2010".
В более поздних версиях распространенных дистрибутивов Linux вы можете использовать:
date -d @1267619929
date -r <number>
работает для меня на Mac OS X.
Эта версия похожа на ответ chiborg, но устраняет необходимость в внешних 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
fi
else
p=$1
fi
date -d "@$p" +%c
Вы можете использовать дату GNU, например,
$ sec=1267619929
$ date -d "UTC 1970-01-01 $sec secs"
или
$ date -ud @1267619929
Вы можете использовать этот простой 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 }'
Я написал script, который делает это сам:
#!/bin/bash
LANG=C
if [ -z "$1" ]; then
if [ "$(tty)" = "not a tty" ]; then
p=`cat`;
else
echo "No timestamp given."
exit
fi
else
p=$1
fi
echo $p | gawk '{ print strftime("%c", $0); }'
В этом ответе я копирую ответ Дениса Уильямсона и слегка его модифицирую, чтобы увеличить скорость при переполнении столбца многих временных меток на 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
fi
else
date -d @$1 +%c
fi
Так как 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' "[email protected]"
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 2017
1508880462
Tue Oct 24 16:27:42 CDT 2017
По крайней мере, кажется, работает на моей машине.
$ uname -a
Darwin XXX-XXXXXXXX 16.7.0 Darwin Kernel Version 16.7.0: Thu Jun 15 17:36:27 PDT 2017; root:xnu-3789.70.16~2/RELEASE_X86_64 x86_64
Пример:
$ 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)