如何从datetime.timedelta对象获取时间?

28 投票
2 回答
37955 浏览
提问于 2025-04-15 11:10

一个MySQL数据库表里有一列,数据类型是时间(http://dev.mysql.com/doc/refman/5.0/en/time.html)。当我们访问这个表的数据时,Python会把这一列的值返回为一个叫做datetime.timedelta的对象。我该怎么从中提取出时间呢?(我其实不太明白timedelta在Python手册里是用来干嘛的)。

举个例子,这个表中的某一列包含的值是“18:00:00”,而Python-MySQLdb返回的是datetime.timedelta(0, 64800)。


请忽略下面的内容(它返回的值不同) -

补充说明:无论表中的时间值是什么,python-MySQLdb似乎总是返回datetime.timedelta(0, 64800)。

注意:我使用的是Python 2.4

2 个回答

3

我觉得MySQL中的TIME类型是用来表示时间间隔的,类似于Python中的datetime.timedelta。从你提到的文档来看:

TIME的值范围可以从'-838:59:59'到'838:59:59'。小时部分可以这么大,是因为TIME类型不仅可以表示一天中的某个时间(这个必须小于24小时),还可以表示经过的时间或者两个事件之间的时间间隔(这个可能大于24小时,甚至是负值)。

如果不想把datetime.timedelta转换成datetime.time,另一种选择是把列的类型改成DATETIME,然后不使用日期字段。

-插入:

tIn = datetime.datetime(
    year=datetime.MINYEAR, 
    month=1, 
    day=1, 
    hour=10,
    minute=52,
    second=10
    )
cursor.execute('INSERT INTO TableName (TimeColumn) VALUES (%s)', [tIn])

-选择:

 cursor.execute('SELECT TimeColumn FROM TableName')
 result = cursor.fetchone()
 if result is not None:
     tOut = result[0].time()
     print 'Selected time: {0}:{1}:{2}'.format(tOut.hour, tOut.minute, tOut.second)

在datetime对象上调用datetime.time()可以得到一个时间对象。

52

奇怪的是,Python 返回的值是 datetime.timedelta 类型。其实它应该返回 datetime.time 类型。无论如何,看起来它返回的是从午夜到现在的时间(假设表格中的时间是下午6点)。要把它转换成 datetime.time,你可以这样做:

value = datetime.timedelta(0, 64800)
(datetime.datetime.min + value).time()

datetime.datetime.mindatetime.time() 当然在 datetime 模块中有详细的说明,如果你想了解更多信息。

顺便说一下,datetime.timedelta 是用来表示两个 datetime.datetime 值之间的时间差。所以如果你用一个 datetime.datetime 减去另一个,你会得到一个 datetime.timedelta。而如果你把一个 datetime.datetime 和一个 datetime.timedelta 相加,你会得到一个新的 datetime.datetime。这就是上面代码的工作原理。

撰写回答