Data / conversão de tempo usando time.mktime parece errado

votos
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.mktimedeve retornar o número de segundos desde a época. Desde que eu estou dando-lhe um tempo à meia-noite ea época é à meia-noite, não deve o resultado ser divisível pelo número de segundos em um dia?

Publicado 22/08/2008 em 10:06
fonte usuário
Em outras línguas...                            


4 respostas

votos
7

Resposta curta: Por causa de fusos horários.

O Epoch está em UTC.

Por exemplo, eu estou no IST (Horário padrão irlandês) ou UTC + 1. time.mktime()é relativa ao meu fuso horário, por isso no meu sistema refere-se ao

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

Porque você tem o resultado 1233378000, que sugeriria que você está 5 horas atrás de mim

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

Ter um olhar para a time.gmtime()função que funciona off UTC.

Respondeu 22/08/2008 em 10:24
fonte usuário

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

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

hora local ... fantasia isso.

A tupla tempo:

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.

Aliás, parece que estamos a ser de 6 horas de intervalo:

>>> time.mktime((2009, 1, 31, 0, 0, 0, 5, 31, -1))
1233356400.0
>>> (1233378000.0 - 1233356400)/(60*60)
6.0
Respondeu 22/08/2008 em 10:21
fonte usuário

votos
2

A resposta de Phil realmente resolvido isso, mas eu vou elaborar um pouco mais. Desde a época está em UTC, se eu quiser comparar outras vezes para a época, eu preciso interpretá-los como UTC também.

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

Ao converter a tupla tempo para um timestamp tratamento é o tempo UTC, eu recebo um número que é divisível pelo número de segundos em um dia.

Eu posso usar isto para converter uma data para uma representação dias-de-the-época que é o que eu sou, em última instância, depois.

Respondeu 22/08/2008 em 11:12
fonte usuário

votos
0

Interessante. Eu não sei, mas eu fiz tente o seguinte:

>>> 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

que é o que você esperava. Meu palpite? Talvez alguma correção tempo foi feito desde a época. Este poderia ser apenas alguns segundos, algo como um ano bissexto. Acho que ouvi algo como isso antes, mas não me lembro exatamente como e quando é feito ...

Respondeu 22/08/2008 em 10:22
fonte usuário

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