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

492

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

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

У некоторых версий даты это есть, а у некоторых нет. Так что это не всегда присутствует. Я запустил "тип-дата" и использовал другую версию, и это сработало. Scott Rowley
Извините, я должен сказать, что ... "Дата", кажется, не предлагает такой вариант. Есть ли более простой способ? - прочитайте инструкцию еще раз ;-) TheBonsai
FWIW, в Ubuntu есть только / bin / date, для которого работает ответ @ Steef. Jonathan Hartley

Ваш Ответ

7   ответов
914

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

date +%s
За миллисекундыdate +%s%3N
@ livefree75date не встроен вbashтак твоя версияbash не имеет ничего общего с чемdate реализация вашей системы поставляется с.
И если вы хотите, чтобы доли секунды, до девяти десятичных знаков, используйте:date +%s.%N
Не работает для меня. свидание не показывает% s. У меня должна быть очень старая версия bash (3.2.51 (1) для Solaris)?
дата manpge должна быть изменена с%s seconds since 1970-01-01 00:00:00 UTC в%s seconds since the epoch, 1970-01-01 00:00:00 UTC потому что я пропустил это там.
16

Определить количество секунд с начала эпохи (1 января 1970 г.) для любой заданной даты (например, 21 октября 1973 г.)

$ date -j -f "%b %d %Y %T" "Oct 21 1973 00:00:00" "+%s"
120034800

Обратите внимание, что для полноты я добавил часть времени в формат. Причина в том, чтоdate возьму любую часть даты, которую вы дали, и добавьтеcurrent время до предоставленной стоимости. Например, если вы выполните вышеупомянутую команду в 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

%N опция, указанная для доли секунды в дате GNU, отсутствует в дате MacOS. На 10.14 ни один из форматов отсутствует на странице руководства; они находятся вstrftime(3) Страница man, которая у вас не будет, если у вас не установлен XCode, и может не отображаться командой man, даже если вы это делаете.
Чтобы быть понятным, это для BSDdate команда, тогда как любые решения, предлагающиеdate -d для GNUdate, Дата BSD в macOScomes from FreeBSDи делится рядом опций с NetBSD и OpenBSD. А этоentirely separate из Баш.
109



Получите секунды с начала эпохи (1 января 1970 г.) для любой заданной даты (например, 21 октября 1973 г.).

date -d "Oct 21 1973" +%s


 Преобразовать количество секунд назад в дату

date --date @120024000


  Командаdate довольно универсален. Еще одна крутая вещь, которую вы можете сделать с датой (бесстыдно скопировано сdate --help). Show the local time for 9AM next Friday on the west coast of the US

date --date='TZ="America/Los_Angeles" 09:00 next Fri'

Еще лучше, найдите время, чтобы прочитать справочную страницу http://man7.org/linux/man-pages/man1/date.1.html

Это не вопрос ОП, но он отвечает на мой, так что +1 от меня.
30

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

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

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

$ echo $EPOCHSECONDS
1547624774

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

$ echo $EPOCHREALTIME
1547624774.371215

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

$ echo ${EPOCHREALTIME/./}
1547624774371215

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

14

awk 'BEGIN {srand(); print srand()}'
Вау, должен был пойти посмотреть это. Это прагматичное решение, но не обязательно хорошее / переносимое.It seems that implementations of awk srand() обычно отображаются с текущей датой / временем. Второй звонокsrand() возвращает значение, ранее использовавшееся в качестве начального числа.
Вау, это неясно
0

~/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" "[email protected]"

Похожие вопросы