Команда даты в Linux, отыскивая секунды до следующего часа

Как найти секунды для следующего часа с использованием даты? Я знаю, что могу сделать

date -d "next hour"

но это добавляет 1 час к настоящему времени. Я хочу, чтобы он показывал секунды до следующего полного часа. Например, если текущее время 9:39am, я хочу найти количество секунд до 10am

Ответ 1

Ну, всегда есть простой матовый способ:

read min sec <<<$(date +'%M %S')
echo $(( 3600 - 10#$min*60 - 10#$sec ))

ИЗМЕНИТЬ: удалено условие гонки, добавлено явное основание. Спасибо, @rici и @gniourf_gniourf.

Ответ 2

Временная метка эпохи прямо сейчас

now=$(date '+%s')

В следующий час

next=$(date -d $(date -d 'next hour' '+%H:00:00') '+%s')

Число секунд до следующего часа

echo $(( next - now ))

Для непрерывного решения используйте функции:

now() { date +%s; }
next() { date -d $(date -d "next ${1- hour}" '+%H:00:00') '+%s'; }

И теперь у вас есть

echo $(( $(next) - $(now) ))

и даже

echo $(( $(next day) - $(now) ))

Другой способ

Еще один подход с меньшим математическим по-прежнему использует временную метку эпохи. Мы знаем, что это началось через час, поэтому timestamp mod 3600 только равен нулю в час. Таким образом,

$(( $(date +%s) % 3600 ))

- количество секунд с последнего часа, а

$(( 3600 - $(date +%s) % 3600 ))

- количество секунд до следующего.

Ответ 3

С Bash ≥4.2 вы можете использовать printf с модификатором %(...)T для доступа к датам (текущая дата соответствует аргументу -1 или пустая с версии 4.3):

printf -v left '%(3600-60*10#%M-10#%S)T' -1
echo "$((left))"

Чистый Bash и без подоболочек!

10# здесь, чтобы гарантировать, что арифметика Bash (расширена в $((...))) обрабатывает следующее число в radix 10. Без этого вы получите ошибку, если минута или секунда 08 или 09.

Ответ 4

Попробуйте сделать это:

LANG=C
now=$(date +%s)
next="$(date |
    perl -pe 's/(\d{2}):\d{2}:\d{2}/sprintf "%.2d:00:00", $1 + 1/e')"
next=$(date -d "$next" +%s)
echo $(( next - now ))

OUTPUT:

2422

Ответ 5

#!/usr/bin/env bash
is=`date +%S`
im=`date +%M`
echo $((((60-$im)*60)+(60-$is)))