web-dev-qa-db-ja.com

python2のpython3datetime.timestamp?

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()とは異なります。

たぶん冬/夏の時間のためですか?

15
Niols

以下を使用して、python 2のタイムスタンプに変換します

int((mod_time.mktime(first_run.timetuple())+first_run.microsecond/1000000.0))

8

python2ではtime.time()を使用します。これは、python3のdatetime.timestamp()に類似しています。

datetime.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)

4
Reishin