22:00に関数を呼び出すpython3コードがあります。
_# Imports
from datetime import datetime, date, time, timedelta
import sched
import time as mod_time
# Find the next datetime corresponding to 22:00
first_run = datetime.combine(date.today(), time(22,0))
first_run = first_run if first_run > datetime.now() else first_run + timedelta(1)
# Dumb test function
def my_function():
print('my_function')
# Run the function at 22:00
scheduler = sched.scheduler(mod_time.time, mod_time.sleep)
scheduler.enterabs(first_run.timestamp(), 1, my_function, ())
scheduler.run()
_
このコードは現在python3で動作しています。 Python2で動作させたいです。私の唯一の問題は以下から来ています:
_first_run.timestamp()
_
私はそれを次のようなものに置き換えようとしました:
_(first_run - datetime(1970, 1, 1)).total_seconds()
_
しかし、私のタイムゾーンに問題があるようです(UTCは簡単すぎるでしょう、私はUTC + 2にいます)。 first_runにtzinfoがあるはずです。多分私は何かを追加する必要がありますか?
私はかなり迷っています、そしてどんな助けもいただければ幸いです。私を助けてくれてありがとう。
編集1:
Haochen Wuのコメントの後、私は読んだ 日時をUnixタイムスタンプに変換し、Pythonで元に戻す
これで、次の行が私にとって同等であることがわかりました。
_(datetime.now() - datetime(1970, 1, 1)).total_seconds()
(datetime.now() - datetime.utcfromtimestamp(0)).total_seconds()
_
解決策は
_(datetime.now() - datetime.fromtimestamp(0)).total_seconds()
_
しかし、そうではありません。この値はまだmod_time.time()
とは異なります。
たぶん冬/夏の時間のためですか?
以下を使用して、python 2のタイムスタンプに変換します
int((mod_time.mktime(first_run.timetuple())+first_run.microsecond/1000000.0))
python2ではtime.time()
を使用します。これは、python3のdatetime.timestamp()
に類似しています。
現在の日時の実現が必要な場合は、python3での実装を参照してください。
def timestamp(self):
"Return POSIX timestamp as float"
if self._tzinfo is None:
return _time.mktime((self.year, self.month, self.day,
self.hour, self.minute, self.second,
-1, -1, -1)) + self.microsecond / 1e6
else:
return (self - _Epoch).total_seconds()
ここで、_Epoch = datetime(1970、1、1、tzinfo = timezone.utc)