Python时代
我正在尝试将日期字符串转换为年龄 字符串类似于:“Mon,Nov 2008 01:45:32+0200”,我需要计算它有多少天了 我已使用以下方法成功转换日期:Python时代,python,datetime,Python,Datetime,我正在尝试将日期字符串转换为年龄 字符串类似于:“Mon,Nov 2008 01:45:32+0200”,我需要计算它有多少天了 我已使用以下方法成功转换日期: >>> time.strptime("Mon, 17 Nov 2008 01:45:32 +0200","%a, %d %b %Y %H:%M:%S +0200") (2008, 11, 17, 1, 45, 32, 0, 322, -1) 由于某种原因%z为+0200提供了一个错误,但这并不重要 我可以使用以下方法
>>> time.strptime("Mon, 17 Nov 2008 01:45:32 +0200","%a, %d %b %Y %H:%M:%S +0200")
(2008, 11, 17, 1, 45, 32, 0, 322, -1)
由于某种原因%z为+0200提供了一个错误,但这并不重要
我可以使用以下方法获取当前时间:
>>> time.localtime()
(2009, 2, 3, 19, 55, 32, 1, 34, 0)
但是我如何才能从另一项中减去一项,而不必遍历列表中的每一项并手动执行它呢?您需要使用模块
datetime
和对象
timedelta(天[、秒[、微秒[、毫秒[、分钟[、小时[、周]]]在Python中,
datetime
对象本机支持减法:
from datetime import datetime
age = datetime.now() - datetime.strptime(...)
print age.days
结果是一个对象。谢谢大家,我最终得到了以下结果:
def getAge( d ):
""" Calculate age from date """
delta = datetime.now() - datetime.strptime(d, "%a, %d %b %Y %H:%M:%S +0200")
return delta.days + delta.seconds / 86400.0 # divide secs into days
给予:
>>> getAge("Mon, 17 Nov 2008 01:45:32 +0200")
78.801319444444445
如果您不想使用datetime(例如,如果您的Python很旧,并且您没有该模块),您可以只使用时间模块
s = "Mon, 17 Nov 2008 01:45:32 +0200"
import time
import email.utils # Using email.utils means we can handle the timezone.
t = email.utils.parsedate_tz(s) # Gets the time.mktime 9-tuple, plus tz
d = time.time() - time.mktime(t[:9]) + t[9] # Gives the difference in seconds.
自Python 3.2以来,
datetime.strtime()
如果提供了%z
指令,则返回一个可感知的datetime对象:
#!/usr/bin/env python3
from datetime import datetime, timezone, timedelta
s = "Mon, 17 Nov 2008 01:45:32 +0200"
birthday = datetime.strptime(s, '%a, %d %b %Y %H:%M:%S %z')
age = (datetime.now(timezone.utc) - birthday) / timedelta(1) # age in days
print("%.0f" % age)
在较旧的Python版本上,可以使用的正确版本为:
#!/usr/bin/env python
import time
from email.utils import parsedate_tz, mktime_tz
s = "Mon, 17 Nov 2008 01:45:32 +0200"
ts = mktime_tz(parsedate_tz(s)) # seconds since Epoch
age = (time.time() - ts) / 86400 # age in days
print("%.0f" % age)
两个代码示例产生相同的结果。由于闰年(和秒)的原因,这不能保证是正确的。datetime模块知道闰年。它可能也知道闰秒,但当OP关心以天为单位的时间时,这似乎并不重要。看起来他关心以年为单位的时间。函数返回天数。它对于我所需要的东西是否超级准确并不重要。谢谢!:)代码段不正确。您需要从datetime而不是date导入“datetime”(或使用date对象,而不是datetime对象)。如果输入的日期字符串不在本地时区中,则结果不正确。您需要相反的方式或其他方式来跟踪给定的UTC偏移量,例如。另外,
tdelta.days
可能会给出令人惊讶的结果,例如,timedelta(秒=-5)。days=-1
tdelta/timedelta(1)
可以替代使用(或者在较旧的Python版本上使用它的模拟值:timedelta(seconds=-5)。total_seconds()/86400
)。如果t1
和t2
具有不同的UTC偏移量,则结果也可能是错误的,例如,如果t1
是标准时间而t2
是夏季时间(is_dst=1
)--请参阅.1了解parsedate。尽管由于+t[9]
,您的代码生成了错误的结果,
#!/usr/bin/env python3
from datetime import datetime, timezone, timedelta
s = "Mon, 17 Nov 2008 01:45:32 +0200"
birthday = datetime.strptime(s, '%a, %d %b %Y %H:%M:%S %z')
age = (datetime.now(timezone.utc) - birthday) / timedelta(1) # age in days
print("%.0f" % age)
#!/usr/bin/env python
import time
from email.utils import parsedate_tz, mktime_tz
s = "Mon, 17 Nov 2008 01:45:32 +0200"
ts = mktime_tz(parsedate_tz(s)) # seconds since Epoch
age = (time.time() - ts) / 86400 # age in days
print("%.0f" % age)