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

634

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

dateпохоже, не предлагает такой вариант. Есть ли простой способ?

н-александр
источник
22
Извините, я должен сказать это ... »« Дата не предлагает такой вариант. Есть ли простой способ? »- прочитайте руководство снова ;-)
TheBonsai
7
Некоторые версии даты имеют это, а некоторые нет. Так что это не всегда присутствует. Я запустил 'type -a date' и использовал другую версию, и это сработало.
Скотт Роули
1
FWIW, в Ubuntu есть только / bin / date, для которого работает ответ @ Steef
Джонатан Хартли,
1
@TheBonsai, который не является частью стандартной версии инструмента даты POSIX. Просто потому, что она есть в вашей версии (возможно, GNU), вы не должны предполагать, что у всех есть реализация.
Wyatt8740

Ответы:

1160

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

date +%s
Steef
источник
45
Дата manpge должна быть изменена с %s seconds since 1970-01-01 00:00:00 UTCна, %s seconds since the epoch, 1970-01-01 00:00:00 UTCпотому что я пропустил это там.
Девин
3
Не работает для меня свидание не показывает% s. У меня должна быть очень старая версия bash (3.2.51 (1) для Solaris)?
livefree75
7
@ livefree75 dateне встроен bash, поэтому ваша версия bashне имеет ничего общего с dateреализацией вашей системы.
Адриан Фрювирт,
11
И если вы хотите, чтобы доли секунды, до девяти десятичных знаков, используйте:date +%s.%N
Джонатан Хартли
19
Для миллисекунд использоватьdate +%s%3N
Хуан Кампа
133

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

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

pellucide
источник
Это не вопрос ОП, но он отвечает на мой, поэтому +1 от меня.
AnthonyD973
Может быть, это версия dateили потому что я использую zsh(macOS Catalina), но это не работает для меня. Запуск $ date -d "Oct 21 1973" +%sвыходныхusage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Джошуа Пинтер
43

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

$ printf -v beg '%(%s)T\n' -2
$ printf -v now '%(%s)T\n' -1
$ echo beg=$beg now=$now elapsed=$((now-beg))
beg=1583949610 now=1583953032 elapsed=3422
gniourf_gniourf
источник
9
Вы хотите использовать его -2в случае, если у вас есть более продолжительное задание (например, сценарий для управления вашими резервными копиями), и в конце отправьте письмо «Резервное копирование началось с $ somewhen, завершено за $ now» - что можно сделать, -2избегая хранения выделенная переменная в начале.
Себастьян Дж.
24

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

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

$ echo $EPOCHSECONDS
1547624774

Также есть EPOCHREALTIMEдоли секунды.

$ echo $EPOCHREALTIME
1547624774.371215

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

$ echo ${EPOCHREALTIME/./}
1547624774371215

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

Socowi
источник
Для разрешения в миллисекундах (в том же формате, что и date +%s%3Nвы) вы можете использоватьecho $(( ${EPOCHREALTIME/./} / 1000 ))
luckman212
23

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

awk 'BEGIN {srand(); print srand()}'
Стивен Пенни
источник
21
Ничего себе неясного
ericslaw
8
Вау, должен был пойти посмотреть это. Это прагматичное решение, но не обязательно хорошее / переносимое. Кажется, что реализации awksrand() обычно засеиваются с текущей датой / временем. Второй вызов srand()возвращает значение, ранее использовавшееся в качестве начального числа.
Райан Рэнсфорд
19

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

PeqNP
источник
1
Для ясности, это для команды BSD date, в то время как любые решения, предлагаемые date -dдля GNU date. Дата BSD в macOS взята из FreeBSD и имеет несколько вариантов с NetBSD и OpenBSD. И это совершенно отдельно от Баш.
Готи
%Nуказана опция дробных секунд в дате Gnu отсутствует дата MacOS. На 10.14 ни один из форматов отсутствует на странице руководства; они находятся на strftime(3)странице руководства , которой у вас не будет, если у вас не установлен XCode, и они могут не увидеть команду man, даже если вы это сделаете.
Дэн
1

используйте этот скрипт (мой ~/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" "$@"
комонада
источник