2015-05-04 11 views
5

Ho un pezzo di python codice 3, che chiama una funzione alle 22:00.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() 

Questo codice sta lavorando in pitone . Mi piacerebbe che funzionasse in python . Il mio unico problema deriva dal seguente:

first_run.timestamp() 

ho provato a sostituirlo con qualcosa di simile:

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

Ma sembra che ci sia un problema con il mio fuso orario (UTC sarebbe troppo facile, I' m in UTC + 2). Ci dovrebbe essere qualcosa con tzinfo in first_run. Forse dovrei aggiungere qualcosa?

Sono abbastanza perso e ogni aiuto sarebbe apprezzato. Grazie mille per avermi aiutato.

Edit1:

Dopo il commento di Haochen Wu, ho letto Convert datetime to Unix timestamp and convert it back in python

Ora so che le righe seguenti sono equivalenti per me:

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

La soluzione deve essere

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

Ma questo non è il caso. Questo valore è ancora diverso da mod_time.time().

Forse a causa delle ore invernali/estive?

+1

Hai letto questo: http://stackoverflow.com/questions/19801727/convert-datetime-to-unix-timestamp-and-convert-it-back-in- python –

+0

L'ho appena letto. Ora so che '(datetime.now() - datetime (1970, 1, 1)). Total_seconds()' è equivalente per me a '(datetime.now() - datetime.utcfromtimestamp (0)). Total_seconds() '. La soluzione dovrebbe essere '(datetime.now() - datetime.fromtimestamp (0)). Total_seconds()'. Ma questo non è il caso. Questo valore è ancora diverso da 'mod_time.time()'. Forse a causa delle ore invernali/estive? – Niols

+0

La mia ipotesi migliore è che sarà necessario implementare una sottoclasse di tzinfo e aggiungerla all'oggetto datetime. Vedi i documenti: https: //docs.python.org/2/library/datetime.html#tzinfo-objects –

risposta

2

utilizzare quanto segue per convertire in una timesta deputato nel python 2

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

+0

La formula corretta non sarebbe 'int (mod_time.mktime (first_run.timetuple()) + first_run.microsecond/1000000.0)'? Questo sembra funzionare. A meno che mi manchi qualcosa? – Niols

+0

sei corretto, ho moltiplicato per 1000 troppo. Io uso molto i timestamp nella libreria javascript flot dove devi moltiplicare per 1000 tutto il tempo per ottenere il timestamp rappresentato correttamente –

+0

In realtà, ecco la formula (quasi) esatta dal codice sorgente datetime python3: 'mod_time.mktime (first_run .timetuple()) + first_run.microsecond/1e6'. Questo è quasi tuo (modulo il piccolo errore * 1000). – Niols

0

uso time.time() in python2, è analogo a datetime.timestamp() in python3

datetime.datetime.timestamp

SE il necessario per la realizzazione datetime corrente, vedere attuazione di tale in 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() 

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

+0

Questo non è corretto. time.time() restituirà solo il timestamp dell'ora corrente, non il timestamp dell'istanza datetime. –

+0

Il problema è che 'time.time()' restituisce il timestamp corrente e non il timestamp corrispondente a un'ora specifica data da un elemento datetime. – Niols

+0

@Niols in modo da ignorare completamente la seconda parte della risposta, nice – Reishin

Problemi correlati