2011-01-14 12 views
5

Ich bin mit Daten seit Epoche zu arbeiten, und schon bekam, zum Beispiel:Python: Sekunden seit Epoche relatives Datum

date = 6928727.56235 

Ich mag diese in einer anderen relatives Format zu transformieren, so dass ich Ich werde in der Lage sein, dies in etwas relativ zur Epoche umzuwandeln.

Mit time.gmtime (Datum), kehrte er

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

denke ich Epoche beginnt '01/01/1970 00.00.00' , so dass die Methode den relativen Zeitpunkt in etwas zurückgeben soll wie :

'2 months 21 days 04:38:47' 

Alles, was hilft?

+0

22 März 04.38 ist nicht 2 Monate 22 Tage 04.38 nach 01-Januar 00:00 Uhr. – eumiro

+1

Nein, es ist tatsächlich 2 Monate 21 Tage 04:38:47 ... – eumiro

Antwort

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) 

Returns 80 days 04:38:47, was richtig ist, aber nicht genau das, was OP (80 Tage statt 2 Monate 21 Tage) wollte.

+0

+1, mein Fehler früher – mouad

+0

Vielen Dank. Diese Lösung ist genug für mich. –

1

time.gmtime gibt ein ParseTuple Objekt und die einzelnen Elemente des Tupels verwenden können Ihre Berechnung tun. So etwas wie diese

>>> 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 für "etwas wie". –

4

Das Verfahren sollte das relative Datum in etwas zurückgeben wie: '2 Monate 22 Tage 04.38.47'

Sie können das nicht tun, da Ein Monat ist zwischen 28 und 31 Tagen lang. Die Aussage "2 Monate und 22 Tage" könnte zwischen 81 und 84 Tagen bedeuten. (Oder zwischen 78 und 84 Tagen, wenn die Monate nicht aufeinander folgen müssen).

Also was Sie wollen, ist einfach unsinnig. Eine relative Datumszeit kann nur in Tagen, Stunden und Sekunden gezählt werden, bis die Differenz so groß ist, dass die Anzahl der Tage keine Rolle mehr spielt. In diesem Fall können Sie in Monaten oder Jahren beginnen zu zählen (aber dann können Sie keine Tage angeben) nicht mehr).

So können Sie sagen "fünf Jahre und zwei Monate" oder "80 Tage und drei Stunden" oder "zweihundert Jahre". Aber man kann nicht "zwei Monate und drei Tage" oder "fünf Jahre und 20 Tage" sagen. Die Aussagen ergeben einfach keinen Sinn.

Daher ist die richtige Antwort ist in der Tat eumiros

timedelta(seconds=6928727.56235) 

Aber jetzt auch Sie wissen, warum.

(Es sei denn natürlich, Sie mit Monat tatsächlich Mondzyklen bedeuten, die tun eine feste Länge haben. :))

+0

Vielen Dank für diese Erklärung, und ich werde darüber nachdenken, es anstelle der anderen Syntax zu verwenden ('zwei Monate ...'). Was du gesagt hast, ergibt Sinn. Danke für das hinzufügen. –

+0

@ GabrielL.Oliveira: Im Allgemeinen ist [ein Tag nicht 86400 (SI?) Sekunden] (http: // stackoverflow.com/a/20335352/4279) genau, es sei denn wir sprechen über POSIX-Zeit (wie durch Ihre Frage impliziert), die sich von UTC unterscheidet. Daher ist "Tage + Sekunden + Mikrosekunden" genauso sinnvoll wie "Monate + Tage", dh Sie können sie verwenden, wenn Sie (in Ihrem speziellen Fall) den Unterschied zwischen 86400 und 86401 (Millionen Mikrosekunden) oder 28 und 31 (drei Tage) entsprechend. – jfs

Verwandte Themen