在MySQL数据库中存储Python的time.struct_time的最佳方法

2 投票
2 回答
1453 浏览
提问于 2025-04-16 07:04

我正在使用Python的feedparser模块来解析RSS源。解析后,feedparser会返回一个Python的9元组时间格式(time.struct_time)。

我想把这些值存储到我的MySQL数据库中,这样我以后就可以检查这个源的Last-Modified头信息。重要的是,如果时间元组被转换过,那么在转换回来的时候要保持一致,这样我才能用它们进行比较。

我尝试将时间元组转换为日期时间格式,然后再转换回去,但转换回来后却不一样:

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

你觉得有什么方法可以做到这一点呢?

2 个回答

1

在数据库中把日期和时间存储为协调世界时(UTC),同时记录下时区信息。如果需要从数据库中取出数据时,可以把它转换回当地时间。

1

我觉得你遇到的问题是因为is_dst这个值被改变了。time.mktime这个函数会尊重struct里的is_dst值,但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)

顺便说一下,这里有个例子,展示你提到的方法是如何可能导致时间元组丢失的。假设远程服务器所在的地方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)

撰写回答