2011-01-14 15 views
5

pracuję z datami od epoki, a już dostał, na przykład:Python: sekund od epoki do względnej daty

date = 6928727.56235 

Chciałbym przekształcić to w innym formacie względnym, tak że I” Będą w stanie przekształcić to w coś związanego z epoką.

Korzystanie time.gmtime (data), powrócił

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

myślę epoka zaczyna się w '01/01/1970 00:00:00' , więc metoda powinna powrócić względną datę w czymś takim :

'2 months 21 days 04:38:47' 

Wszystko, co może pomóc?

+0

22 marca 04:38 nie ma 2 miesiące 22 dni 04:38 po 01 stycznia 00:00. – eumiro

+1

Nie, to właściwie 2 miesiące 21 dni 04:38:47 ... – eumiro

Odpowiedz

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) 

Zwraca 80 days 04:38:47, która jest poprawna, ale nie dokładnie to, co chciał OP (80 dni zamiast 2 miesiące 21 dni).

+0

+1, mój błąd wcześniej – mouad

+0

Dziękuję. To rozwiązanie mi wystarcza. –

1

time.gmtime zwraca obiekt ParseTuple i można korzystać z pojedynczych elementów krotki wykonać obliczenia. Coś takiego

>>> 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 dla "nieco jak". –

4

Metoda powinna powrócić względną datę w coś takiego: '2 miesiące 22 dni 04:38:47'

nie można zrobić, że od miesiąc trwa od 28 do 31 dni. Stwierdzenie "2 miesiące i 22 dni" może oznaczać od 81 do 84 dni. (Lub między 78 a 84 dniami, jeśli miesiące nie muszą być kolejne).

To, czego chcesz, jest po prostu bezsensowne. Datę względną można policzyć tylko w dniach, godzinach i sekundach, aż różnica stanie się tak duża, że ​​liczba dni przestanie mieć znaczenie, w takim przypadku możesz zacząć liczenie w miesiącach lub latach (ale wtedy nie możesz uwzględnić dni już).

Więc można powiedzieć „pięć lat i dwa miesiące”, czy „80 dni i trzy godziny”, lub „dwieście lat”. Ale nie możesz powiedzieć "dwa miesiące i trzy dni" lub "pięć lat i 20 dni". Oświadczenia po prostu nie mają sensu.

Dlatego prawidłowa odpowiedź jest rzeczywiście eumiros

timedelta(seconds=6928727.56235) 

Ale teraz wiecie dlaczego.

(Chyba, oczywiście, z miesiąca właściwie znaczy cykle księżyca, który zrobić mają stałą długość. :))

+0

Dziękuję za to wyjaśnienie i pomyślę o użyciu go zamiast drugiej składni ("dwa miesiące ..."). To, co powiedziałeś, ma sens. Dziękuję za ten dodatek. –

+0

@ GabrielL.Oliveira: Ogólnie rzecz biorąc, [dzień nie wynosi 86400 (SI?) Sekund] (http: // stackoverflow.com/a/20335352/4279) dokładnie, chyba że mówimy o czasie POSIX (jak sugeruje twoje pytanie), który różni się od UTC. Dlatego "dni + sekundy + mikrosekundy" mają taki sam sens, jak "miesiące + dni", tzn. Można z nich korzystać, jeśli można zignorować (w danym przypadku) różnicę między 86400 a 86401 (milion mikrosekund) lub 28 i 31 (trzy dni). – jfs

Powiązane problemy