Dato / klokkeslett konvertering ved hjelp time.mktime virker galt

stemmer
3
>>> import time
>>> time.strptime(01-31-2009, %m-%d-%Y)
(2009, 1, 31, 0, 0, 0, 5, 31, -1)
>>> time.mktime((2009, 1, 31, 0, 0, 0, 5, 31, -1))
1233378000.0
>>> 60*60*24 # seconds in a day
86400
>>> 1233378000.0 / 86400
14275.208333333334

time.mktimeskal returnere antall sekunder siden epoke. Siden jeg gir det en tid ved midnatt og epoken er ved midnatt, ikke bør resultatet være delelig med antall sekunder i en dag?

Publisert på 22/08/2008 klokken 09:06
kilden bruker
På andre språk...                            


4 svar

stemmer
7

Kort svar: På grunn av tidssoner.

The Epoch er i UTC.

For eksempel, jeg er på IST (irsk Standard Time) eller UTC + 1. time.mktime()er i forhold til min tidssone, så på mitt system dette refererer til

>>> time.mktime((2009, 1, 31, 0, 0, 0, 5, 31, -1))
1233360000.0

Fordi du fikk resultatet 1233378000, ville det tyde på at du er 5 timer bak meg

>>> (1233378000 - 1233360000) / (60*60)    
5

Ta en titt på den time.gmtime()funksjon som fungerer off UTC.

Svarte 22/08/2008 kl. 09:24
kilden bruker

stemmer
3
mktime(...)
    mktime(tuple) -> floating point number

    Convert a time tuple in local time to seconds since the Epoch.

lokal tid ... fancy det.

Tiden tuppel:

The other representation is a tuple of 9 integers giving local time.
The tuple items are:
  year (four digits, e.g. 1998)
  month (1-12)
  day (1-31)
  hours (0-23)
  minutes (0-59)
  seconds (0-59)
  weekday (0-6, Monday is 0)
  Julian day (day in the year, 1-366)
  DST (Daylight Savings Time) flag (-1, 0 or 1)
If the DST flag is 0, the time is given in the regular time zone;
if it is 1, the time is given in the DST time zone;
if it is -1, mktime() should guess based on the date and time.

Forresten, synes vi å være 6 timers mellomrom:

>>> time.mktime((2009, 1, 31, 0, 0, 0, 5, 31, -1))
1233356400.0
>>> (1233378000.0 - 1233356400)/(60*60)
6.0
Svarte 22/08/2008 kl. 09:21
kilden bruker

stemmer
2

Phil svar egentlig løst det, men jeg skal utdype litt mer. Siden epoken er i UTC, hvis jeg ønsker å sammenligne andre ganger til epoken, trenger jeg å tolke dem som UTC også.

>>> calendar.timegm((2009, 1, 31, 0, 0, 0, 5, 31, -1))
1233360000
>>> 1233360000 / (60*60*24)
14275

Ved å konvertere tiden tuppel til et tidsstempel behandling er så UTC tid, får jeg et tall som er delelig med antall sekunder i en dag.

Jeg kan bruke dette til å konvertere en dato til en dag-fra-epoken representasjon som er hva jeg til slutt etter.

Svarte 22/08/2008 kl. 10:12
kilden bruker

stemmer
0

Interessant. Jeg vet ikke, men jeg fikk prøve dette:

>>> now = time.mktime((2008, 8, 22, 11 ,17, -1, -1, -1, -1))
>>> tomorrow = time.mktime((2008, 8, 23, 11 ,17, -1, -1, -1, -1))
>>> tomorrow - now
86400.0

som er det du forventet. Jeg gjetter? Kanskje litt tid korreksjon ble gjort siden epoke. Dette kan være bare noen få sekunder, noe som et skuddår. Jeg tror jeg hørte noe som dette før, men kan ikke huske nøyaktig hvor og når det er gjort ...

Svarte 22/08/2008 kl. 09:22
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more