21
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

指定の時間まで待機するpythonプログラム

Last updated at Posted at 2018-07-29

目的・動機

pythonでプログラムを書いていて、
ある時間より後だったら何もしない、前だったらその時間まで "待機する"
みたいなプログラムが書きたかった。
ググってみたが意外と情報がなかったため、メモとして投稿。

プログラム

全体を以下に示す。
細かい部分の説明は後述。
モジュールの説明は省略。

xxx.py
from datetime import datetime, timedelta
import sched
import time


def def1(name):
    print name


now = datetime.now()
now = datetime(now.year, now.month, now.day, now.hour, now.minute, 0)
comp = datetime(now.year, now.month, now.day, now.hour, 30)
diff = comp - now

if int(diff.days) >= 0:
    scheduler = sched.scheduler(time.time, time.sleep)
    scheduler.enter(diff.seconds, 1, def1, ("hoge", ))
    scheduler.run()
else:
    print "do nothing"

プログラム実行例

例1
プログラム実行日時 : 2018/07/29 16:25:00
指定時刻 : 2018/07/29 16:30:00
実行結果 : 16:30:00まで待機して、”hoge” 出力

例2
プログラム実行日時 : 2018/07/29 16:25:00
指定時刻 : 2018/07/29 16:20:00
実行結果 : 何もせずプログラム終了

ある時間と現在の時刻の差分取得

1行目で現在の日時の取得。
変数now の小数点がそのままだとあとあと処理がやりづらくなるため、2行目で秒を0に変更。
3行目で同日同時間30分の日時情報を取得。
4行目で差分を計算。

now = datetime.now()
now = datetime(now.year, now.month, now.day, now.hour, now.minute, 0)
comp = datetime(now.year, now.month, now.day, now.hour, 30)
diff = comp - now

現在時刻がある時間より前か後かで条件分岐

if が前だった場合
指定時刻まで待機して関数def1 を実行。待機する時間はdiff.seconds が指定してくれる。
else が後だった場合
サンプルプログラムでは特に何も実行しない。

if int(diff.days) >= 0:
    scheduler = sched.scheduler(time.time, time.sleep)
    scheduler.enter(diff.seconds, 1, def1, ("hoge", ))
    scheduler.run()
else:
    print "do nothing"

あとがき

他にこんな書き方できるよとか、ここの処理がまずいなどの意見がありましたら、遠慮せず言ってください。

21
22
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?