Как преобразовать количество секунд, прошедших с 00:00 1 января 2001 года, в человеческое читаемая дата в bash?

Я проигнорировал ошибки SeLinux, понизил версию c3p0 с 9.5 до 9.1, запустил rhn-satellite restartи теперь вошел в открытый космос. Я также зашел в vi /etc/sysconfig/networkи добавил запись HOSTNAME=my.spacewalk.server.

4
24.10.2019, 21:34
2 ответа

Поскольку эпоха Unix 1970 -01 -01 00 :00 :00 UTC, а не 2001 -01 -01 00 :00 :00 UTC, доступно инструменты, такие как команда gnu date, должны просто указывать секунды между ними в дополнение к фактическим данным, чтобы получить результат, используя встроенные -функции преобразования.

$ seconds=500000
$ TZ=UTC date --iso-8601=s -d @$(( $(date +%s -d '2001-01-01T00:00:00+00') + $seconds ))
2001-01-06T18:53:20+00:00

ОБНОВЛЕНИЕ:(благодаря комментарию @Kusalananda )на самом деле даже нет необходимости упоминать эпоху Unix, потому что команда даты GNU допускает прямое добавление смещения времени к заданной дате. Он должен быть снабжен правильным суффиксом (здесьseconds). Это делает команду более простой, универсальной и удобной для чтения :

.
$ seconds=500000
$ TZ=UTC date --iso-8601=s -d "2001-01-01T00:00:00+00 + $seconds seconds"
2001-01-06T18:53:20+00:00

Чтобы выводить точно так же, как выходной формат OP, замените --iso-8601=sна'+%F %T %z'

Приведенная выше команда использует эти опции и параметры:

  • -d:использовать заданную дату, а не текущую дату. Может включать добавления смещения времени.
  • --iso-8601=s— это формат ISO, похожий на (плюс-минус пробелы и т. д.)+%F %T %zто же, что и+Y-%m-%d %H:%M:%S %z:не требует пояснений, с %z смещением часового пояса относительно UTC, которое здесь будет +0000, так как TZ=UTCзаставил его.
5
27.01.2020, 20:50

Использование реализации awk, которая поддерживает mktime()и strftime()(, например mawkили GNUawk):

$ awk 'BEGIN { epoch = mktime("2001 01 01 00 00 00"); print strftime("%F %T %z", epoch + 500000) }'
2001-01-06 18:53:20 +0000

Сначала создается метка времени UNIX, соответствующая 2001 -01 -01 в 00 :00, а затем добавляется 500000 секунд, форматируется и печатается результат в соответствии со строкой формата strftime(). Расчеты здесь выполняются по местному времени.

С секундами, взятыми из аргумента в командной строке:

awk -v offset=500000 '
    BEGIN { epoch = mktime("2001 01 01 00 00 00")
            print strftime("%F %T %z", epoch + offset) }'

Чтение секунд из стандартного ввода (первое слово в каждой строке):

awk 'BEGIN { epoch = mktime("2001 01 01 00 00 00") }
           { print strftime("%F %T %z", epoch + $1)   }'

Описание функций mktime()и strftime()см. в руководстве awk, а также доступные строки формата см. в man strftime.

Установите для переменной среды TZ значение UTCдля выполнения вычислений и вывода в формате UTC, а не по местному времени:

TZ=UTC awk...as above...
2
27.01.2020, 20:50

Теги

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