在mysql数据库中存储python time.struct_time的最佳方法

问题描述:

我正在使用python的feedparser模块来解析RSS提要。一旦解析,feedparser就会以python 9元组时间格式(time.struct_time)返回日期。在mysql数据库中存储python time.struct_time的最佳方法

我想将这些值存储在我的mysql数据库中,这样我可以稍后检查提要的Last-Modified headers。这是重要的,如果时间元组被转换,当转换回来时它们保持不变,所以我稍后可以使用它们进行比较。

我想这时候的元组转换为datetime,然后回来,但转换回时,它是不一样的:

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

你觉得是这样做的方法是什么?

我相信你的方法不保留时间元组的原因是因为is_dst值被改变了。 time.mktime尊重is_dststruct,但dt.timetuple更改为is_dst为-1。

避免此错误的一种方法是将时间元组解释为表示UTC时间。这可能不是严格正确的,但对您的目的而言可能足够好。

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。下面是一个示例,显示您发布的方法可能无法保留时间元组。假设远程服务器在is_dst = 1的语言环境中,而在您的语言环境中is_dst = 0:

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'最终帮助了我。谢谢。 – imns 2010-11-15 15:03:55

将datetime作为UTC存储在数据库中以及时区。如果需要从数据库中提取时,转换回本地时间。