Мне нужно что-то простое, например date
, но в секундах с 1970 года вместо текущей даты, часов, минут и секунд.
date
, похоже, не предлагает эту опцию. Есть ли простой способ?
Это должно работать:
date +%s
%s seconds since 1970-01-01 00:00:00 UTC
на %s seconds since the epoch, 1970-01-01 00:00:00 UTC
потому что я пропустил это там.
Просто чтобы добавить.
Получите секунды с начала эпохи (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 будет использовать время запуска оболочки вместо текущей даты (но зачем вам это нужно?).
-2
в случае, если у вас есть более продолжительное задание (например, сценарий для управления вашими резервными копиями), и в конце отправьте письмо «Резервное копирование началось с $ somewhen, когда было завершено за $ now» - что можно выполнить с -2
избегая хранить выделенную переменную в начале.
Это расширение для того, что сделал @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
date
BSD, тогда как любые решения, предлагающие date -d
предназначены для date
GNU. Дата BSD в macOS взята из FreeBSD и имеет ряд опций для NetBSD и OpenBSD. И это совершенно отдельно от Баш.
%N
указанная для доли секунды в дате gnu, отсутствует в дате MacOS. На 10.14 ни один из форматов отсутствует на странице руководства; они находятся на strftime(3)
странице strftime(3)
, которой у вас не будет, если у вас не установлен Xcode, и они могут не увидеть команду man, даже если вы это сделаете.
С большинством реализаций Awk:
awk 'BEGIN {srand(); print srand()}'
srand()
обычно заполнены текущей датой / временем. Второй вызов srand()
возвращает значение, ранее использовавшееся в качестве начального числа.
Начиная с bash
5.0 вы можете использовать встроенную переменную 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" "$@"