2016-01-06 97 views
6

说我有一些格式为%H:%M:%S的字符串,例如: 04:35:45。我想将它们转换为datetime.datetime对象,年/月/日与datetime.datetime.now()相同。什么是从“%H:%M:%S”创建日期时间的最佳方式

我试图

now = datetime.now() 
datetime_obj = datetime.strptime(time_string, "%H:%M:%S") 
datetime_obj.year = now.year 
datetime_obj.month = now.month 
datetime_obj.day = now.day 

因为year/month/day是只读属性这是行不通的。那么最好的解决方案是什么?

回答

7

你想datetime.combine(date, time)

>>> time = datetime.datetime.strptime("04:35:45", "%H:%M:%S").time() 
>>> time 
datetime.time(4, 35, 45) 
>>> day = datetime.datetime.now().date() 
>>> day 
datetime.date(2016, 1, 6) 
>>> datetime.datetime.combine(day, time) 
datetime.datetime(2016, 1, 6, 4, 35, 45) 
>>> 
+0

我个人更喜欢这个答案。 – laike9m

4

第三方dateutil使用在这种情况下,当前日期:

>>> from dateutil.parser import parse 
>>> time_string = "04:35:45" 
>>> parse(time_string) 
datetime.datetime(2016, 1, 6, 4, 35, 45) 

或者,你可以使用.replace()设置年,月,日:

>>> datetime_obj = datetime.strptime(time_string, "%H:%M:%S") 
>>> datetime_obj.replace(year=now.year, month=now.month, day=now.day) 
datetime.datetime(2016, 1, 6, 4, 35, 45) 

虽然,我非常喜欢布鲁诺发布的.combine() option

+0

好。我可以在没有第三方库的情况下做到吗? – laike9m

+0

@ laike9m好的,更新了,谢谢。 – alecxe

1

您可以使用datetime_obj.replace。从文档:

返回具有相同属性的日期时间,除了那些由指定的关键字参数指定新值的属性。

例如:

from datetime import datetime 

time_string = "04:35:45" 

now = datetime.now() 
datetime_obj = datetime.strptime(time_string, "%H:%M:%S") 
datetime_obj = datetime_obj.replace(
     year = now.year, 
     month = now.month, 
     day = now.day 
     ) 

print datetime_obj 

它打印:

2016-01-06 04:35:45 
1

你可能只是打发时间的整数,以datetime.replace,而无需创建两个datetime对象:

time_sring = "12:31:33" 
hr, mn, sec = map(int, time_sring.split(":")) 
dtetime_obj = datetime.now().replace(hour=hr, minute=mn, second=sec) 
2016-01-06 12:31:33.439492 
相关问题