Как проверить, находится ли текущее время между 23:00 и 06:30

У меня была такая же проблема (acroreader запускается только с правами root) на linux mate x64 с ldap.

Только что установил libnss-ldap: i386, и он без проблем работал как пользователь ldap.

8
16.12.2018, 06:06
5 ответов

У меня похожая ситуация. Моя цель состоит в том, чтобы иметь решение, которое будет очень просто поддерживать для тех, кто не -unix.

Когда мой сервер Linux перезагружается, он запускает сценарий, который отправляет предупреждение. Но если это происходит в рамках нашего «окна обслуживания», который определяется как период между 23:00 субботы и 6:00 воскресенья, я не хочу отправлять страницу, потому что перезагрузка в течение этого окна разрешена (, применены исправления и т. д. ). Я протестировал его, и, насколько я могу судить ), он работает так, как предполагалось (.

Вот календарь для справки:

      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
0
27.01.2020, 20:09

Вы можете преобразовать время в секунды с начала «этого» дня, а затем проверить, что значение секунд больше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
3
27.01.2020, 20:09

Подсказка :Ответ муру выше работал у меня, но вместо || (трубы, "или" ), мне пришлось использовать оператор && ("и" ).

вот так :if [[ "$currenttime" > "23 :00" ]] && [[ "$currenttime" < "06 :30" ]]

-2
27.01.2020, 20:09

В данном конкретном случае альтернативой упрощению теста является добавление часа и один тест менее чем07:30

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

Другое возможное решение. Это будет работать, если вы пересечете полночь или нет. Функция возвращает true, если время находится между интервалами. (В противном случае false ). См. примеры в тестовых частях.

#! /bin/bash
date_between() {
    TIME=$1
    FROM=$2
    TO=$3
    
    RESULT=false

    if [[ "$FROM" < "$TO" ]]; thenFROM < $TIME) || ($TIME < $TO) ]]; then
            RESULT=true
        fi
    fi

    echo $RESULT
}

test_date_between_human
        if [[ ("$FROM" < "$TIME") && ("$TIME" < "$TO") ]]; then
            RESULT=true
        fi
    else
        if [[ ("$FROM" < "$TIME") || ("$TIME" < "$TO") ]]; then
            RESULT=true
        fi
    fi

    echo "$RESULT"
}

test_date_between_human_readable_time_in_range() {
    assertTrue $(date_between '07:10' '07:00' '07:15')
}
test_date_between_human_readable_time_out_of_range() {
    assertFalse $(date_between '07:40' '07:00' '07:15')
}
test_date_between_human_readable_over_midnight_time_in_range() {
    assertTrue $(date_between '23:30' '23:00' '01:00')
}
test_date_between_human_readable_over_midnight_time_out_of_range() {
    assertFalse $(date_between '07:00' '23:00' '01:00')
}

. shunit2

Выполнить:

./date_test.sh                
test_date_between_human_readable_time_in_range
test_date_between_human_readable_time_out_of_range
test_date_between_human_readable_over_midnight_time_in_range
test_date_between_human_readable_over_midnight_time_out_of_range

Ran 4 tests.

OK
1
18.07.2020, 08:26

Теги

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