63

10:30 AM現在の時刻が sayとの間にあるかどうかを確認する最良の方法は何でしょうか4:30 PM

私は次のように考えることができましたが、どれだけ正しいかわかりません:

from datetime import datetime
nw = datetime.now()
hrs = nw.hour;mins = nw.minute;secs = nw.second;
zero = timedelta(seconds = secs+mins*60+hrs*3600)
st = nw - zero # this take me to 0 hours. 
time1 = st + timedelta(seconds=10*3600+30*60) # this gives 10:30 AM
time2 = st + timedelta(seconds=16*3600+30*60)  # this gives 4:30 PM
if nw>= time1 or nw <= time2:
    print "yes, within the interval"

これが正しいアプローチかどうか教えてください。もっと良いものを書くことができますか?

4

8 に答える 8

109

私の最初の回答は、提示された質問に非常に具体的に焦点を当てており、真夜中にわたる時間範囲に対応していませんでした。これは6年経った今でも受け入れられている回答であるため、真夜中をサポートするために拡張された@roubleの回答を以下に組み込みました。

from datetime import datetime, time

def is_time_between(begin_time, end_time, check_time=None):
    # If check time is not given, default to current UTC time
    check_time = check_time or datetime.utcnow().time()
    if begin_time < end_time:
        return check_time >= begin_time and check_time <= end_time
    else: # crosses midnight
        return check_time >= begin_time or check_time <= end_time

# Original test case from OP
is_time_between(time(10,30), time(16,30))

# Test case when range crosses midnight
is_time_between(time(22,0), time(4,00))

datetimeこのロジックのほとんどのアプリケーションは、午前 0 時を超えることがいずれにせよ日付の変更として反映されるオブジェクトにより適しているという、以下の元のコメントにまだ固執しています。

于 2012-04-06T19:28:23.897 に答える
0

平日の午前 9 時から午後 3 時 30 分の間に特定のタスクを実行するという同様の要件がありました。

def somefunction():
    cdate = datetime.datetime.strftime(datetime.datetime.now(), "%d-%m-%Y")
    if (0 <= time.localtime().tm_wday <= 4) and (datetime.datetime.strptime(cdate + " 09:00:00", "%d-%m-%Y %H:%M:%S") <= datetime.datetime.now() <= datetime.datetime.strptime(cdate + " 15:30:00", "%d-%m-%Y %H:%M:%S")):
         << do something >>

説明:

cdate変数は現在の日付を文字列形式で取得します。

この条件は、現在の曜日が >= 0 (月曜日) かつ <= 4 (金曜日) であるかどうかをチェックします。また、現在の時刻のdatetime形式が今日の日付の午前 9:00 以上であるかどうか、および現在の時刻が今日の日付の 15:30 以下であるかどうかもチェックします。

于 2020-04-17T19:02:03.187 に答える