如何检查当前时间是否在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时间戳和从不更新那些....
穆鲁

Answers:


17

如果您需要检查的时间HH:MM是在23: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

@jbrahy那是OP的想法(有问题)
老师

5

如果您想更明确地说明要匹配的时间,可以使用一条case语句。这是一个24小时循环,里面带有case语句,该语句指示当前时间是否与您的范围相符:

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

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
Jeff Schaller

谢谢杰夫,是的,我在寻找建议。我不知道codereview网站。谢谢
丹尼尔(Daniel)

0

在这种特殊情况下,使测试更简单的另一种方法是增加一个小时,然后一次测试少于 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
那没有任何意义。当前时间的可能值大于“ 23:00” 小于“ 06:30”?提示:没有。
Scott
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.