Python时间老化

时间:2009-02-03 20:12:07

标签: python datetime

我正在尝试将日期字符串转换为年龄。

这个字符串就像:“星期一,2008年11月17日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.localtime()
(2009, 2, 3, 19, 55, 32, 1, 34, 0)

但是如何在不通过列表中的每个项目并手动执行的情况下从另一个中减去一个?

6 个答案:

答案 0 :(得分:16)

您需要使用模块datetime和对象datetime.timedelta

from datetime import datetime

t1 = datetime.strptime("Mon, 17 Nov 2008 01:45:32 +0200","%a, %d %b %Y %H:%M:%S +0200")
t2 = datetime.now()

tdelta = t2 - t1 # actually a datetime.timedelta object
print tdelta.days

答案 1 :(得分:5)

在Python中,datetime个对象本身支持减法:

from datetime import datetime
age = datetime.now() - datetime.strptime(...)
print age.days

结果是timedelta对象。

答案 2 :(得分:2)

from datetime import datetime, timedelta
datetime.now()
datetime.datetime(2009, 2, 3, 15, 17, 35, 156000)
datetime.now() - datetime(1984, 6, 29 )
datetime.timedelta(8985, 55091, 206000)
datetime.now() - datetime(1984, 6, 29 )
datetime.timedelta(8985, 55094, 198000) # my age...

timedelta(天[,秒[,微秒[,毫秒[,分钟[,小时[,周]]]]]]])

答案 3 :(得分:1)

如果您不想使用日期时间(例如,如果您的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.

答案 4 :(得分:0)

谢谢大家,我最终得到了以下内容:

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

答案 5 :(得分:0)

自Python 3.2起,如果提供了datetime.strptime()指令,%z将返回一个知晓的日期时间对象:

#!/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版本中,可以使用@Tony Meyer's answer的正确版本:

#!/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)

两个代码示例都会产生相同的结果。