Мне нужно что-то простое, например date
, но в секундах с 1970 года вместо текущей даты, часов, минут и секунд.
date
, похоже, не предлагает эту опцию. Есть ли простой способ?
Мне нужно что-то простое, например date
, но в секундах с 1970 года вместо текущей даты, часов, минут и секунд.
date
, похоже, не предлагает эту опцию. Есть ли простой способ?
Это должно работать:
date +%s
Просто чтобы добавить.
Получите секунды с начала эпохи (1 января 1970 г.) для любой заданной даты (например, 21 октября 1973 г.).
date -d "Oct 21 1973" +%s
Преобразовать количество секунд назад в дату
date --date @120024000
Команда date
является довольно универсальным. Еще одна крутая вещь, которую вы можете сделать с датой (беззастенчиво скопированная с date --help
). Покажите местное время для 9:00 в следующую пятницу на западном побережье США.
date --date='TZ="America/Los_Angeles" 09:00 next Fri'
А еще лучше уделите некоторое время чтению справочной страницы http://man7.org/linux/man-pages/man1/date.1.html
Пока все ответы используют внешнюю программу date
.
Так как Bash 4.2, printf
имеет новый модификатор %(dateformat)T
, который при использовании с аргументом -1
выводит текущую дату в формате, заданном dateformat
, обрабатывается strftime(3)
(man 3 strftime
для информацию о форматах).
Итак, для чистого решения Bash:
printf '%(%s)T\n' -1
или если вам нужно сохранить результат в переменной var
:
printf -v var '%(%s)T' -1
Нет внешних программ и без подоболочек!
Так как Bash 4.3, возможно даже не указать -1
:
printf -v var '%(%s)T'
(но может быть разумнее всегда давать аргумент -1
тем не менее).
Если вы используете -2
как аргумент вместо -1
, Bash будет использовать время запуска оболочки вместо текущей даты (но зачем вам это нужно?).
Это расширение для того, что сделал @pellucide, но для Mac:
Чтобы определить количество секунд с эпохи (1 января 1970 г.) для любой даты (например, 21 октября 1973 г.)
$ date -j -f "%b %d %Y %T" "Oct 21 1973 00:00:00" "+%s"
120034800
Обратите внимание, что для полноты я добавил временную часть в формат. Причиной является то, что date
возьмет любую дату, которую вы ему дали, и добавьте текущее время к предоставленному значению. Например, если вы выполните указанную выше команду в 16:19, без части "00: 00: 00", она автоматически добавит время. Такие, что "21 октября 1973" будут проанализированы как "21 октября 1973 года 16:19:00". Возможно, это не то, что вы хотите.
Чтобы преобразовать метку времени в дату:
$ date -j -r 120034800
Sun Oct 21 00:00:00 PDT 1973
Страница руководства Apple для реализации даты: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html
С большинством реализаций Awk:
awk 'BEGIN {srand(); print srand()}'
Начиная с bash
5.0 (выпущен 7 января 2019 года) вы можете использовать встроенную переменную EPOCHSECONDS
.
$ echo $EPOCHSECONDS
1547624774
Существует также EPOCHREALTIME
который включает доли секунд.
$ echo $EPOCHREALTIME
1547624774.371215
EPOCHREALTIME
можно преобразовать в микросекунды (мкс), удалив десятичную точку. Это может представлять интерес при использовании встроенной арифметики bash
(( expression ))
которая может обрабатывать только целые числа.
$ echo ${EPOCHREALTIME/./}
1547624774371215
Во всех приведенных выше примерах значения времени одинаковы для лучшей читаемости. В действительности значения времени будут отличаться, так как выполнение каждой команды занимает небольшое количество времени.
используйте этот bash script (мой ~/bin/epoch
):
#!/bin/bash
# get seconds since epoch
test "x$1" == x && date +%s && exit 0
# or convert epoch seconds to date format (see "man date" for options)
EPOCH="$1"
shift
date -d @"$EPOCH" "[email protected]"