2010-11-14 5 views
2

J'utilise le module feedparser de python pour analyser un flux RSS. Une fois analysé, feedparser renvoie les dates dans un format d'heure python 9 (time.struct_time).Meilleure façon de stocker un python time.struct_time dans une base de données mysql

Je veux stocker ces valeurs dans ma base de données MySQL afin que je puisse vérifier plus tard le Last-Modified headers du flux. Il est important de savoir que si les tuples de temps sont convertis, ceux-ci, une fois reconvertis, restent les mêmes, donc je peux les utiliser plus tard pour la comparaison.

J'ai essayé de convertir le tuple de temps en datetime puis en arrière, mais il n'a pas été la même chose quand reconverti:

dt = datetime.fromtimestamp(time.mktime(struct)) 
time_tuple = dt.timetuple() 

Que pensez-vous est la méthode pour le faire?

Répondre

1

Je crois que la raison pour laquelle votre méthode ne préserve pas l'intervalle de temps est que la valeur is_dst a été modifiée. time.mktime respecté le is_dst dans struct, mais dt.timetuple modifie is_dst à -1. Une façon d'éviter cette erreur serait d'interpréter l'instant de référence comme représentant une heure UTC. Ce n'est peut-être pas tout à fait correct, mais cela peut suffire à vos fins.

In [1]: import datetime as dt 
In [2]: import time 
In [3]: import calendar 

In [17]: time_tuple=(1970, 1, 1, 0, 0, 0, 3, 1, 1) 

In [18]: timestamp=calendar.timegm(time_tuple) 
In [19]: timestamp 
Out[19]: 0 

In [20]: date=dt.datetime.utcfromtimestamp(timestamp) 
In [21]: date 
Out[21]: datetime.datetime(1970, 1, 1, 0, 0) 

In [22]: tuple(date.timetuple()) 
Out[22]: (1970, 1, 1, 0, 0, 0, 3, 1, -1) 

PS. Voici un exemple montrant comment la méthode que vous avez publiée peut échouer à préserver le tuple de temps. Supposons que le serveur distant se trouve dans un environnement local où is_dst = 1, alors que is_dst = 0 dans votre environnement local:

In [11]: time_tuple=(1970, 1, 1, 0, 0, 0, 3, 1, 1) 

In [12]: timestamp=time.mktime(time_tuple) 
In [13]: timestamp 
Out[13]: 14400.0 

In [14]: date=dt.datetime.fromtimestamp(timestamp) 
In [15]: date 
Out[15]: datetime.datetime(1969, 12, 31, 23, 0) 

In [16]: tuple(date.timetuple()) 
Out[16]: (1969, 12, 31, 23, 0, 0, 2, 365, -1) 
+0

'calendar.timegm' m'a aidé. Merci. – imns

1

Stockez le datetime en tant qu'UTC dans la base de données, avec le fuseau horaire. Convertir à une heure locale lorsque vous extrayez de la base de données si nécessaire.

Questions connexes