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

498

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

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

  • 19
    Извините, я должен сказать это ... »« Дата не предлагает такой вариант. Есть ли простой способ? »- прочтите руководство еще раз ;-)
  • 5
    Некоторые версии даты есть, а некоторые нет. Так что это не всегда присутствует. Я запустил 'type -a date' и использовал другую версию, и это сработало.
Показать ещё 1 комментарий
Теги:
datetime

7 ответов

885
Лучший ответ

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

date +%s
  • 34
    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)?
Показать ещё 3 комментария
100

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

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

  • 0
    Это не вопрос ОП, но он отвечает на мой, поэтому +1 от меня.
29

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

  • 7
    Вы хотите использовать -2 в случае, если у вас есть более продолжительное задание (например, сценарий для управления вашими резервными копиями), и в конце отправьте письмо «Резервное копирование началось с $ somewhen, когда было завершено за $ now» - что можно выполнить с -2 избегая хранить выделенную переменную в начале.
16

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

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

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

awk 'BEGIN {srand(); print srand()}'
  • 13
    Вау, это неясно
  • 5
    Вау, должен был пойти посмотреть это. Это прагматичное решение, но не обязательно хорошее / переносимое. Кажется, что реализации awk srand() обычно заполнены текущей датой / временем. Второй вызов srand() возвращает значение, ранее использовавшееся в качестве начального числа.
2

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

Начиная с bash 5.0 вы можете использовать встроенную переменную EPOCHSECONDS.

$ echo $EPOCHSECONDS
1547624774

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

$ echo $EPOCHREALTIME
1547624774.371215

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

$ echo ${EPOCHREALTIME/./}
1547624774371215

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

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню