Ответ 1
Ну, всегда есть простой матовый способ:
read min sec <<<$(date +'%M %S')
echo $(( 3600 - 10#$min*60 - 10#$sec ))
ИЗМЕНИТЬ: удалено условие гонки, добавлено явное основание. Спасибо, @rici и @gniourf_gniourf.
Как найти секунды для следующего часа с использованием даты? Я знаю, что могу сделать
date -d "next hour"
но это добавляет 1 час к настоящему времени. Я хочу, чтобы он показывал секунды до следующего полного часа. Например, если текущее время 9:39am
, я хочу найти количество секунд до 10am
Ну, всегда есть простой матовый способ:
read min sec <<<$(date +'%M %S')
echo $(( 3600 - 10#$min*60 - 10#$sec ))
ИЗМЕНИТЬ: удалено условие гонки, добавлено явное основание. Спасибо, @rici и @gniourf_gniourf.
Временная метка эпохи прямо сейчас
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 ))
- количество секунд до следующего.
С 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
.
Попробуйте сделать это:
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
#!/usr/bin/env bash is=`date +%S` im=`date +%M` echo $((((60-$im)*60)+(60-$is)))