Làm thế nào để kiểm tra xem thời gian hiện tại là từ 23:00 đến 06:30


9

Tôi gặp khó khăn trong việc nắm bắt cách kiểm tra chính xác từ tập lệnh bash nếu thời gian hiện tại là từ 23:00 đến 06:30. Tôi đang cố gắng chạy một vòng lặp vô hạn để kiểm tra thời gian và để làm gì đó nếu phạm vi thời gian là từ 11 giờ tối đến 6:30 sáng. Đây là những gì tôi đã viết cho đến nay, mà không hoạt động vào ngày hôm sau:

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 &
 }

Tôi đang làm gì sai?


"không hoạt động vào ngày hôm sau" ... nếu bạn sử dụng dấu thời gian 23:00 và 06:30 của ngày hôm qua và không bao giờ cập nhật chúng ....
muru

Câu trả lời:


17

Nếu tất cả những gì bạn cần là kiểm tra xem HH:MMcó trong khoảng từ 23:00 đến 06:30 hay không, thì đừng sử dụng dấu thời gian Unix. Chỉ cần kiểm tra các HH:MMgiá trị trực tiếp:

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 &
}

Ghi chú:

  • Thời gian trong HH:MMsẽ theo thứ tự từ điển, vì vậy bạn có thể so sánh trực tiếp chúng dưới dạng chuỗi.
  • Tránh sử dụng -ahoặc -otrong[ ] , sử dụng ||&&thay vào đó.
  • Vì đây là bash, thích [[ ]]hơn [ ], nó làm cho cuộc sống dễ dàng hơn.

Bạn có thể kiểm tra thời gian hiện tại trong một múi giờ cụ thể không? Cảm ơn!
tommy.carstensen

1
@ tommy.carstensen bạn có thể nhận dateđể sử dụng một múi giờ cụ thể bằng cách sử dụng TZbiến (ví dụ, TZ=Asia/Tokyo datehoặcTZ=UTC date +%H:%M
muru

Tôi sẽ cho bạn thêm một điểm cộng chỉ để đặt tên cho phương thức fireup ()
jbrahy

@jbrahy đó là ý tưởng của OP (đó là trong câu hỏi)
muru

5

Nếu bạn muốn rõ ràng hơn về thời gian bạn muốn khớp, bạn có thể sử dụng một casetuyên bố. Đây là một vòng lặp 24 giờ với một tuyên bố trường hợp bên trong cho biết thời gian hiện tại có khớp với phạm vi của bạn hay không:

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

Để sử dụng nó trong tập lệnh của bạn, chỉ cần thay thế các biến bằng một lệnh gọi đến date:

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

Bạn có thể xem xét việc thân thiện hơn với CPU của mình và tính toán khoảng thời gian giữa (bây giờ) và thời gian bắt đầu tiếp theo và sleeptrong khoảng thời gian đó.


Ồ Đây là một giải pháp rất bất ngờ và tuyệt vời. Cảm ơn!
SinaOwolabi

1

Bạn có thể chuyển đổi thời gian thành giây kể từ khi bắt đầu ngày "này" và sau đó kiểm tra xem giá trị giây có lớn hơn 23*60*60(82800) hay thấp hơn6*60*60+30*60 (23400) không.

Để có được giây kể từ khi bắt đầu ngày "này", bạn có thể làm:

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

Và bài kiểm tra sẽ là:

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

0

Tôi đã gặp một tình huống tương tự. Mục tiêu của tôi là có một giải pháp rất đơn giản để các chuyên viên máy tính không unix duy trì.

Khi máy chủ Linux của tôi khởi động lại, nó sẽ chạy một đoạn script gửi cảnh báo. Nhưng nếu điều này xảy ra như là một phần của "Cửa sổ bảo trì" được xác định là từ 11 giờ tối thứ bảy đến 6 giờ sáng chủ nhật, tôi không muốn gửi trang này, vì khởi động lại trong cửa sổ này là OK (áp dụng các bản vá, v.v.). Tôi đã thử nghiệm nó và nó hoạt động như dự định (theo như tôi có thể nói).

Dưới đây là lịch để tham khảo:

      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

Đây là mã kiểm tra của tôi:

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

Đây là đầu ra

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
Vì điều này dường như cố gắng trả lời câu hỏi, tôi đã bỏ nó, với một số chỉnh sửa. Nếu bạn thực sự muốn có ai đó xem lại mã của mình, tôi sẽ đề xuất codereview.stackexchange.com
Jeff Schaller

Cảm ơn Jeff, vâng, tôi đã tìm kiếm gợi ý. Tôi không biết về trang web codereview. Cảm ơn
Daniel

0

Trong trường hợp cụ thể này, một cách khác để làm cho bài kiểm tra đơn giản hơn là thêm một giờ và kiểm tra một lần với giá thấp hơn 07:30

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

-2

Gợi ý: câu trả lời của muru ở trên có tác dụng với tôi, nhưng thay vì | | (ống, "hoặc"), tôi phải sử dụng toán tử && ("và").

như thế này: if [["$ currenttime"> "23:00"]] && [["$ currenttime" <"06:30"]]


2
Điều đó không có ý nghĩa gì. Giá trị nào của thời gian hiện tại là lớn hơn cả 23:00 và cũng ít hơn so với 06:3030? Gợi ý: không có gì cả.
Scott
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.