Мне нужно что-то простое, как 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вместо аргумента вы используете аргумент -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
-2в случае, если у вас есть более продолжительное задание (например, сценарий для управления вашими резервными копиями), и в конце отправьте письмо «Резервное копирование началось с $ somewhen, завершено за $ now» - что можно сделать, -2избегая хранения выделенная переменная в начале.
Начиная с версии bash5.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, даже если вы это сделаете.