Время Python к возрасту
Я пытаюсь преобразовать строку даты в возраст.
Строка выглядит так: "Пн, 17 ноября 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.localtime()
(2009, 2, 3, 19, 55, 32, 1, 34, 0)
но как я могу вычесть одно из другого, не проходя каждый пункт в списке и не делая это вручную?
6 ответов
Вам нужно использовать модуль 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
В Python datetime
объекты изначально поддерживают вычитание:
from datetime import datetime
age = datetime.now() - datetime.strptime(...)
print age.days
Результатом является объект timedelta.
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(дни [, секунды [, микросекунды [, миллисекунды [, минуты [, часы [, недели]]]]]]]))
Если вы не хотите использовать datetime (например, если ваш Python старый и у вас нет модуля), вы можете просто использовать модуль time.
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.
Спасибо, ребята, я закончил со следующим:
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
Начиная с Python 3.2, datetime.strptime()
возвращает осведомленный объект datetime, если %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:
#!/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)
Оба примера кода дают одинаковый результат.