Получить текущее время в секундах с начала эпохи в Linux, Bash

Мне нужно что-то простое, например date, но в секундах с 1970 года вместо текущей даты, часов, минут и секунд.

date, похоже, не предлагает эту опцию. Есть ли простой способ?

Ответ 1

Это должно работать:

date +%s

Ответ 2

Просто чтобы добавить.

Получите секунды с начала эпохи (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

Ответ 3

Пока все ответы используют внешнюю программу 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 будет использовать время запуска оболочки вместо текущей даты (но зачем вам это нужно?).

Ответ 4

Это расширение для того, что сделал @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

Ответ 5

С большинством реализаций Awk:

awk 'BEGIN {srand(); print srand()}'

Ответ 6

Чистое решение для bash

Начиная с bash 5.0 (выпущен 7 января 2019 года) вы можете использовать встроенную переменную EPOCHSECONDS.

$ echo $EPOCHSECONDS
1547624774

Существует также EPOCHREALTIME который включает доли секунд.

$ echo $EPOCHREALTIME
1547624774.371215

EPOCHREALTIME можно преобразовать в микросекунды (мкс), удалив десятичную точку. Это может представлять интерес при использовании встроенной арифметики bash (( expression )) которая может обрабатывать только целые числа.

$ echo ${EPOCHREALTIME/./}
1547624774371215

Во всех приведенных выше примерах значения времени одинаковы для лучшей читаемости. В действительности значения времени будут отличаться, так как выполнение каждой команды занимает небольшое количество времени.

Ответ 7

используйте этот 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]"