現在の時刻が23:00から06:30の間にあるかどうかを確認する方法


9

現在の時刻が23:00から06:30の間である場合、bashスクリプトから適切にチェックする方法を理解するのに苦労しています。時刻を確認するために無限ループを実行し、時間範囲が午後11時から午前6時30分の間の場合は何かを実行しようとしています。これが私がこれまでに書いたものですが、翌日は機能しません。

fireup()
{

 local starttime=$(date --date="23:00" +"%s")
 local endtime=$(date --date="06:30" +"%s")

 while :; do
     local currenttime=$(date +%s)
     if [ "$currenttime" -ge "$starttime" -a "$currenttime" -ge "$endtime" ]; then
        do_something
     else
         do_something_else
     fi
     test "$?" -gt 128 && break
     local currenttime=$(date +%s)
 done &
 }

私は何を間違っていますか?


「翌日には機能しません」...昨日の23:00と06:30のタイムスタンプを使用し、それらを更新しない場合....
muru

回答:


17

HH:MM23:00から06:30の間であるかどうかを確認するだけの場合は、Unixタイムスタンプを使用しないでください。HH:MM値を直接確認するだけです。

fireup()
{  
  while :; do
   currenttime=$(date +%H:%M)
   if [[ "$currenttime" > "23:00" ]] || [[ "$currenttime" < "06:30" ]]; then
     do_something
   else
     do_something_else
   fi
   test "$?" -gt 128 && break
  done &
}

ノート:

  • 入力時刻はHH:MM辞書式順序になるため、文字列として直接比較できます。
  • 使用しないでください-aまたは-o[ ]使用、||及び&&その代わり。
  • これはbashですので、を優先[[ ]]してください[ ]

特定のタイムゾーンの現在時刻を確認できますか?ありがとう!
tommy.carstensen

1
@あなたが得ることができますtommy.carstensen date使用して、特定のタイムゾーンを使用するTZ(例えば、変数のTZ=Asia/Tokyo dateTZ=UTC date +%H:%M
muru

メソッドfireup()に名前を付けるためだけに追加のプラスを差し上げます
jbrahy

OPのアイデアである@jbrahy(問題です)
muru

5

一致させたい時間をより明確にしたい場合は、caseステートメントを使用できます。以下は、現在の時刻が範囲に一致するかどうかを示す、caseステートメントを含む24時間ループです。

for hh in {00..23}
do
  for mm in {00..59}
  do
    case $hh:$mm in
        (23:*)        echo YES $hh:$mm;;
        (0[012345]:*) echo YES $hh:$mm;;
        (06:[012]*)   echo YES $hh:$mm;;
        (*)           echo  NO $hh:$mm;;
    esac
  done
done

スクリプトで使用するには、変数を次の呼び出しに置き換えますdate

case $(date +%H:%M) in
    (23:*)        echo YES;;
    (0[012345]:*) echo YES;;
    (06:[012]*)   echo YES;;
    (*)           echo NO;;
esac

CPUにやさしく、(今)から次の開始時刻までの時間を計算し、その時間を計算することを検討してくださいsleep


ワオ。これは非常に予想外の素晴らしい解決策です。ありがとう!
SinaOwolabi 2017年

1

「この」日の開始からの時間を秒に変換し、秒の値が23*60*60(82800)よりも大きいか、または6*60*60+30*60(23400)よりも小さいことを確認できます。

「この」日の開始から秒数を取得するには、次のようにします。

secsSinceMidnight=$(( $(date +%s) - $(date -d '00:00:00' +%s) ))

そしてテストは:

[[ $secsSinceMidnight -lt 23400 || $secsSinceMidnight -gt 82800 ]] && echo YES

0

私も同じような状況です。私の目標は、Unix以外のオタクが維持することが非常に簡単なソリューションを提供することです。

Linuxサーバーが再起動すると、アラートを送信するスクリプトが実行されます。しかし、これが土曜日の午後11時から日曜日の午前6時の間に定義された「メンテナンスウィンドウ」の一部として発生した場合、このウィンドウでの再起動は問題ないため(パッチの適用など)、ページを送信しません。私はそれをテストしましたが、(私が知る限り)意図したとおりに機能します。

参考のためにここにカレンダーがあります:

      June 2018
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

これが私のテストコードです:

FMT='+%k:%a' # i.e. Sat:23 for Saturday at 11pm local time

TESTDATE1=$(date -d '2018-06-23 14:30:00' $FMT)
TESTDATE2=$(date -d '2018-06-23 23:59:59' $FMT)
TESTDATE3=$(date -d '2018-06-24 00:00:00' $FMT)
TESTDATE4=$(date -d '2018-06-24 05:59:59' $FMT)
TESTDATE5=$(date -d '2018-06-24 08:01:00' $FMT)

for VAL in "${TESTDATE1}" $TESTDATE2 $TESTDATE3 $TESTDATE4 $TESTDATE5
do

    #extract the 24 hour value and the day
    HH="$(echo ${VAL} | cut -d':' -f1)"
    DAY="$(echo ${VAL} | cut -d':' -f2)"

    echo Testing $VAL  $HH  $DAY

    if [[ "$DAY" = "Sat" && $HH -ge 23 ]]; then
            echo '    Shhhh People are trying to sleep ... Sat window'
    elif [[ "$DAY" = "Sun" && $HH -le 6 ]]; then
            echo '    People are trying to sleep ... Sun window'
    else
            echo '    PAGE SOMEONE - time is outside the Maintenance Window'
    fi

done

これが出力です

Testing 14:Sat 14 Sat
    PAGE SOMEONE - time is outside the Maintenance Window
Testing 23:Sat 23 Sat
    Shhhh People are trying to sleep ... Sat window
Testing 0:Sun 0 Sun
    People are trying to sleep ... Sun window
Testing 5:Sun 5 Sun
    People are trying to sleep ... Sun window
Testing 8:Sun 8 Sun
    PAGE SOMEONE - time is outside the Maintenance Window

1
これは質問に答えようとしているように見えるので、編集を加えて残しました。誰かにコードをレビューしてもらいたいという気持ちがある場合は、codereview.stackexchange.comをお勧めします
ジェフシャラー

ジェフのおかげで、はい、私は提案を探していました。私はコードレビューサイトを知りませんでした。ありがとう
ダニエル

0

この特定のケースでは、テストを単純化するための代替手段は、1時間を追加して、1か月未満で1回テストすることです。 07:30

if [[ $(date -d "now + 60 minutes" +'%H:%M') < "07:30" ]]
    then echo "wake up"
else
    echo "Zzzzzz"
fi

-2

ヒント:上記のmuruの答えは私には有効でしたが、||の代わりに (パイプ、「または」)、&&(「および」演算子)を使用する必要がありました。

このように:if [["$ currenttime"> "23:00"]] && [["$ currenttime" <"06:30"]]


2
それは意味がありません。可能性は何CURRENTTIMEの値であり、両方とも「夜十一時」よりも大きいとも少ない「午前6時30分」よりも?ヒント:ありません。
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.