2011-01-14 8 views
5

Sto lavorando con date dal epoca, e già ottenuto, per esempio:Python: secondi dal periodo di relativa data

date = 6928727.56235 

Mi piacerebbe trasformare questo in un altro formato relativo, in modo che io' Sarò in grado di trasformare questo in qualcosa di relativo all'epoca.

Utilizzando time.gmtime (data), è tornato

year=1970, mon=3, day=22, hour=4, min=38, sec=47 

penso epoca inizia nel '01/01/1970 0:00:00' , in modo che il metodo deve restituire la data relativa a qualcosa di simile :

'2 months 21 days 04:38:47' 

Qualcosa che aiuti?

+0

22 marzo 04:38 Non è di 2 mesi 22 giorni 04:38 dopo l'01 gennaio alle 00:00. – eumiro

+1

No, in realtà 2 mesi 21 giorni 04:38:47 ... – eumiro

risposta

4
from datetime import timedelta 

a = timedelta(seconds=6928727.56235) 

# a is now datetime.timedelta(80, 16727, 562350) 

print "%d days %02d:%02d:%02d" % (a.days, a.seconds/3600, (a.seconds/60) % 60, a.seconds % 60) 

ritorni 80 days 04:38:47, che è corretto, ma non è esattamente quello OP voleva (80 giorni invece di 2 mesi 21 giorni).

+0

+1, errore mio precedente – mouad

+0

Grazie. Questa soluzione è abbastanza per me. –

1

time.gmtime restituisce un oggetto ParseTuple ed è possibile utilizzare i singoli elementi della tupla per eseguire il calcolo. Qualcosa di simile

>>> time_epoch = time.gmtime(0) 
>>> time_at_hand = time.gmtime(6928727.56235) 
>>> print "It's been %d days somewhat like %d months, %d days and %d hours, %d minutes, %d seconds " % (time_at_hand.tm_yday - time_epoch.tm_yday, time_at_hand.tm_mon - time_epoch.tm_mon , time_at_hand.tm_mday - time_epoch.tm_mday, time_at_hand.tm_hour - time_epoch.tm_hour, time_at_hand.tm_min - time_epoch.tm_min, time_at_hand.tm_sec - time_epoch.tm_sec) 
It's been 80 days somewhat like 2 months, 21 days and 4 hours, 38 minutes, 47 seconds 
+0

+1 per "un po 'come". –

4

Il metodo deve restituire la relativa data di in qualcosa di simile: '2 mesi 22 giorni 04:38:47'

Non si può fare che, dal un mese dura da 28 a 31 giorni. L'affermazione "2 mesi e 22 giorni" potrebbe significare qualsiasi cosa tra 81 e 84 giorni. (O tra 78 e 84 giorni, se i mesi non devono essere consecutivi).

Quindi quello che vuoi è semplicemente privo di senso. Una data relativa può essere conteggiata solo in giorni, ore e secondi, finché la differenza diventa così grande che la quantità di giorni non conta più, nel qual caso puoi iniziare a contare in mesi o anni (ma non puoi includere giorni più).

Quindi si può dire "cinque anni e due mesi", o "80 giorni e tre ore" o "duecento anni". Ma non puoi dire "due mesi e tre giorni" o "cinque anni e 20 giorni". Le affermazioni semplicemente non hanno senso.

Pertanto, la risposta corretta è infatti eumiros

timedelta(seconds=6928727.56235) 

Ma ora si sa anche il perché.

(meno che, naturalmente, con il mese in realtà significa luna-cicli, che fare hanno una lunghezza fissa :).)

+0

Grazie per questa spiegazione, e penserò di usarlo al posto dell'altra sintassi ('due mesi ...'). Quello che hai detto ha senso. Grazie per questo add. –

+0

@ GabrielL.Oliveira: in generale, [un giorno non è 86400 (SI?) Secondi] (http: // stackoverflow.it/a/20335352/4279) esattamente a meno che non stiamo parlando del tempo POSIX (come implicito nella domanda) diverso da UTC. Quindi "giorni + secondi + microsecondi" ha più senso di "mesi + giorni", cioè puoi usarli se puoi ignorare (nel tuo caso particolare) la differenza tra 86400 e 86401 (milioni di microsecondi) o 28 e 31 (tre giorni) corrispondentemente. – jfs

Problemi correlati