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