2008-08-22 19 views
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.mktime doit renvoyer le nombre de secondes écoulées depuis l'époque. Puisque je lui donne un temps à minuit et que l'époque est à minuit, le résultat ne devrait-il pas être divisible par le nombre de secondes d'une journée?La conversion de date/heure à l'aide de time.mktime semble incorrecte

+1

ne sais pas si c'est votre problème mais sais que time.mktime appelle localtime et il m'a mordu dans le cul une ou deux fois. – sparkes

Répondre

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

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

heure locale ... fantaisie que.

Le temps tuple:

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. 

Soit dit en passant, nous semble être 6 heures d'intervalle:

>>> time.mktime((2009, 1, 31, 0, 0, 0, 5, 31, -1)) 
1233356400.0 
>>> (1233378000.0 - 1233356400)/(60*60) 
6.0 
0

intéressants. Je ne sais pas, mais j'ai essayé ceci:

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

ce qui est ce que vous attendiez. Ma conjecture? Peut-être que quelques corrections de temps ont été faites depuis l'époque. Cela pourrait être seulement quelques secondes, quelque chose comme une année bissextile. Je pense avoir entendu quelque chose comme ça avant, mais je ne me souviens pas exactement comment et quand c'est fait ...

7

Réponse courte: En raison des fuseaux horaires.

L'historique est en UTC. Par exemple, je suis sur IST (Irish Standard Time) ou UTC + 1. Par exemple, je suis sur IST (Irish Standard Time) ou UTC + 1. time.mktime() est par rapport à mon fuseau horaire, donc sur mon système fait référence à cette

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

Parce que vous avez obtenu le résultat 1233378000, qui suggérerait que vous êtes 5 heures derrière moi

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

Jetez un oeil à la fonction time.gmtime() qui fonctionne hors UTC.

2

La réponse de Phil a vraiment résolu le problème, mais je vais élaborer un peu plus. Puisque l'époque est en UTC, si je veux comparer d'autres fois à l'époque, j'ai besoin de les interpréter comme UTC.

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

En convertissant le tuple de temps à un horodatage de traitement est le temps UTC, je reçois un nombre qui est divisible par le nombre de secondes dans une journée.

Je peux l'utiliser pour convertir une date en une représentation de jours à partir de l'époque, ce que je suis finalement après.