9

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

3

Я ищу что-то простое, как команда date, но чтобы результатом были секунды с 1970 года, а не текущая дата, часы, минуты и секунды.

Команда date не предоставляет такой возможности. Есть ли простой способ сделать это?

5 ответ(ов)

1

Чтобы добавить немного информации.

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

date -d "Oct 21 1973" +%s

Чтобы преобразовать это количество секунд обратно в дату, выполните следующую команду:

date --date @120024000

Команда date довольно универсальна. Вот еще одна интересная вещь, которую вы можете сделать с помощью date (беспардонно скопировано из date --help):

Показать местное время для 9 утра следующей пятницы на западном побережье США:

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

Лучше всего потратить немного времени на изучение страницы man по команде date: http://man7.org/linux/man-pages/man1/date.1.html

0

На данный момент все ответы используют внешнюю программу 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).

Если вместо -1 использовать -2, 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
0

В большинстве реализаций Awk код:

awk 'BEGIN {srand(); print srand()}'

выводит ненулевое значение, которое является "сечением" (или временной меткой) из функции srand(), обычно используемой для инициализации генератора случайных чисел. Функция srand() при первом вызове устанавливает начальное значение (семя) для генератора, а при последующих вызовах возвращает текущее значение семени. Таким образом, когда вы вызываете srand() второй раз, он возвращает то же значение, которое было установлено на первом вызове, но не изменяет его снова. Поэтому в данном случае вывод будет зависеть от реализации и системы, на которой выполняется Awk, но в большинстве случаев это будет число, отличное от нуля.

0

Это расширение к тому, что сделал @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', она добавит время автоматически, и "Oct 21 1973" будет интерпретироваться как "Oct 21 1973 16:19:00". Это может вам не подойти.

Чтобы конвертировать ваш временной штамп обратно в дату, используйте следующую команду:

$ date -j -r 120034800
Sun Oct 21 00:00:00 PDT 1973

Ссылка на man-страницу Apple для реализации команды date: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html

0

Вы можете использовать следующий bash-скрипт, который я называю ~/bin/epoch:

#!/bin/bash

# Получение секунд с начала эпохи
test "x$1" == x && date +%s && exit 0

# Или преобразование секунд эпохи в формат даты (см. "man date" для опций)
EPOCH="$1"
shift
date -d @"$EPOCH" "$@"

Этот скрипт проверяет, был ли передан аргумент. Если аргумент не указан, он выводит количество секунд, прошедших с начала эпохи (1 января 1970 года). Если аргумент (время в секундах с начала эпохи) предоставлен, он преобразует его в читаемый формат даты с помощью команды date. Вы можете увидеть все доступные опции для форматирования даты, выполнив команду man date.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь