2015-05-04 16 views
5

Mam fragment pytona kod, który wywołuje funkcję o godzinie 22:00.python3 datetime.timestamp w python2?

# 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() 

Kod ten jest obecnie pracuje w Pythonie . Chciałbym, aby działało w python . Mój jedyny problem wynika z następujących powodów:

first_run.timestamp() 

Starałem się zastąpić go czymś takim:

(first_run - datetime(1970, 1, 1)).total_seconds() 

Ale nie wydaje się być problem z mojej strefy czasowej (UTC byłoby zbyt łatwe, I” mw UTC + 2). Powinno być coś z tzinfo w first_run. Może powinienem coś dodać?

Jestem zagubiony i każda pomoc będzie doceniona. Wielkie dzięki za pomoc.

Edit1:

Po komentarzu Haochen Wu, czytałem Convert datetime to Unix timestamp and convert it back in python

Teraz wiem, że następujące linie są równoważne dla mnie:

(datetime.now() - datetime(1970, 1, 1)).total_seconds() 
(datetime.now() - datetime.utcfromtimestamp(0)).total_seconds() 

Roztwór powinien być

Ale tak nie jest. Ta wartość jest wciąż inna niż mod_time.time().

Może ze względu na zimę/lato?

+1

Czytałaś to jedno: http://stackoverflow.com/questions/19801727/convert-datetime-to-unix-timestamp-and-convert-it-back-in- python –

+0

Właśnie to przeczytałem. Teraz wiem, że '(datetime.now() - datetime (1970, 1, 1)). Total_seconds()' jest równoważne dla mnie do '(datetime.now() - datetime.utcfromtimestamp (0)). Total_seconds() '. Rozwiązaniem powinno być '(datetime.now() - datetime.fromtimestamp (0)). Total_seconds()'. Ale tak nie jest. Ta wartość nadal różni się od 'mod_time.time()'. Może ze względu na zimę/lato? – Niols

+0

Moje najlepsze przypuszczenie jest takie, że musisz zaimplementować podklasę tzinfo i dodać ją do obiektu datetime. Zobacz dokumentację: https: //docs.python.org/2/library/datetime.html#tzinfo-objects –

Odpowiedz

2

użyj, aby przekształcić na timesta temp w Pythonie 2

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

+0

Czy prawidłową formułą nie byłaby 'int (mod_time.mktime (first_run.timetuple()) + first_run.microsecond/1000000.0)'? Ten wydaje się działać. Chyba że coś przegapię? – Niols

+0

masz rację, pomnożyłem przez 1000 za dużo. Używam znaczników czasu dużo w bibliotece javascript flot, gdzie trzeba cały czas mnożyć przez 1000, aby znacznik czasu był reprezentowany poprawnie –

+0

W rzeczywistości, tutaj jest (prawie) dokładna formuła z kodu źródłowego datetime3 datetime: 'mod_time.mktime (first_run .timetuple()) + first_run.microsecond/1e6'. To jest prawie twoje (modulo mały * 1000 błąd). – Niols

0

użycie time.time() w python2, to analogowo datetime.timestamp() w python3

datetime.datetime.timestamp

IF jest potrzebne do bieżącej realizacji datetime, zobacz realizację że w 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() 

gdzie _EPOCH = datetime (1970, 1, 1, tzinfo = timezone.utc)

+0

To nie jest poprawne. time.time() poda tylko znacznik czasu bieżącego czasu, a nie znacznik czasu instancji datetime. –

+0

Problem polega na tym, że 'time.time()' zwraca bieżący znacznik czasu, a nie znacznik czasu odpowiadający określonej godzinie podanej przez element datetime. – Niols

+0

@Niols, więc całkowicie ignorujesz drugą część odpowiedzi, niezłą – Reishin

Powiązane problemy