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

时间:2010-11-14 23:16:50

标签: python mysql

我正在使用python的feedparser模块来解析RSS提要。解析后,feedparser以python 9元组时间格式(time.struct_time)返回日期。

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

我试过这个将时间元组转换为datetime然后再返回,但转换回时它不一样了:

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

您认为这样做的方法是什么?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我相信你的方法没有保留时间元组的原因是因为is_dst值被更改了。 time.mktime尊重is_dst中的struct,但dt.timetupleis_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)