2015-05-04 21 views
5

Ich habe ein Stück Python Code, der um 22:00 Uhr eine Funktion aufruft.python3 datetime.timestamp in 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() 

Dieser Code arbeitet derzeit in Python . Ich möchte es in Python arbeiten. Mein einziges Problem kommt aus dem folgenden:

first_run.timestamp() 

Ich versuchte es, mit etwas zu ersetzen:

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

Aber es scheint ein Problem mit meiner Zeitzone zu sein (UTC wäre zu einfach, ich m in UTC + 2). Es sollte etwas mit tzinfo in first_run geben. Vielleicht sollte ich etwas hinzufügen?

Ich bin ziemlich verloren, und jede Hilfe wäre willkommen. Vielen Dank im Voraus für die Hilfe.

EDIT1:

Nach Haochen Wu Kommentar, ich Convert datetime to Unix timestamp and convert it back in python

Jetzt gelesen habe ich weiß, dass die folgenden Zeilen für mich gleichwertig sind:

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

Die Lösung sollte

sein
(datetime.now() - datetime.fromtimestamp(0)).total_seconds() 

Aber das ist nicht der Fall. Dieser Wert unterscheidet sich immer noch von mod_time.time().

Vielleicht wegen der Winter-/Sommerstunden?

+1

Haben Sie lesen diese: http://stackoverflow.com/questions/19801727/convert-datetime-to-unix-timestamp-and-convert-it-back-in- Python –

+0

Ich habe es gerade gelesen. Jetzt weiß ich, dass '(datetime.now() - datetime (1970, 1, 1)). Total_seconds()' ist für mich gleichbedeutend mit '(datetime.now() - datetime.utcfromtimestamp (0)). Total_seconds() '. Die Lösung sollte '(datetime.now() - datetime.fromtimestamp (0)). Total_seconds()' sein. Aber das ist nicht der Fall. Dieser Wert unterscheidet sich immer noch von "mod_time.time()". Vielleicht wegen der Winter-/Sommerstunden? – Niols

+0

Meine beste Vermutung ist, dass Sie eine Unterklasse von TZInfo implementieren und diese zum Datetime-Objekt hinzufügen müssen. Weitere Informationen finden Sie in der Dokumentation: https: //docs.python.org/2/library/datetime.html#tzinfo-objects –

Antwort

2

verwenden Sie die folgenden, um zu einem Timesta zu konvertieren mp in Python 2

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

+0

Wäre nicht die richtige Formel 'int (mod_time.mktime (first_run.timetuple()) + first_run.microsecond/1000000.0)'? Dieser scheint zu arbeiten. Es sei denn, ich vermisse etwas? – Niols

+0

Sie sind richtig, ich multipliziert mit 1000 zu viel. Ich benutze Zeitstempel viel in der flot Javascript Bibliothek, wo Sie die ganze Zeit mit 1000 multiplizieren müssen, um den Zeitstempel korrekt darzustellen –

+0

Eigentlich ist hier die (fast) exakte Formel aus dem python3 datetime Quellcode: 'mod_time.mktime (first_run .timetuple()) + first_run.microsecond/1e6'. Das ist fast deins (modulo der kleine * 1000 Fehler). – Niols

0

Verwendung time.time() in python2, dann ist es analog zu datetime.timestamp() in python3

datetime.datetime.timestamp

Wenn Sie aktuelle Datetime Realisierung benötigen, Implementierung, dass in python3 sehen:

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

wo _EPOCH = Datetime (1970, 1, 1, tzinfo = timezone.utc)

+0

Dies ist nicht korrekt. time.time() gibt nur den Zeitstempel der aktuellen Zeit und nicht den Zeitstempel der Datetime-Instanz an. –

+0

Problem ist, dass 'time.time()' den aktuellen Zeitstempel und nicht den Zeitstempel zurückgibt, der einer bestimmten Stunde entspricht, die von einem datetime-Element angegeben wird. – Niols

+0

@Niols so ignorieren Sie vollständig zweiten Teil der Antwort, nett – Reishin

Verwandte Themen