我需要检查自某个日期以来是否已有数年的时间。目前,我已经从timedelta
模块获得了datetime
,但我不知道如何将其转换为年份。
您需要的不只是timedelta
,它还告诉您已经过去了多少年;您还需要知道开始(或结束)日期。 (这是year年。)
您最好的选择是使用dateutil.relativedelta
object,但这是第三方模块。如果您想知道某个日期后datetime
年(默认为现在)的n
,则可以执行以下操作::
from dateutil.relativedelta import relativedelta def yearsago(years, from_date=None): if from_date is None: from_date = datetime.now() return from_date - relativedelta(years=years)
如果您愿意使用标准库,答案会稍微复杂一些::
from datetime import datetime def yearsago(years, from_date=None): if from_date is None: from_date = datetime.now() try: return from_date.replace(year=from_date.year - years) except ValueError: # Must be 2/29! assert from_date.month == 2 and from_date.day == 29 # can be removed return from_date.replace(month=2, day=28, year=from_date.year-years)
如果是2/29,而18年前还没有2/29,则此函数将返回2/28。如果您希望返回3/1,只需将最后一个
return
语句更改为::
return from_date.replace(month=3, day=1, year=from_date.year-years)
您的问题最初是说您想知道自某个日期以来已有多少年了。假设您想要整数年,则可以基于每年365.25天进行猜测,然后使用上面定义的
yearsago
函数之一进行检查::
def num_years(begin, end=None):
if end is None:
end = datetime.now()
num_years = int((end - begin).days / 365.25)
if begin > yearsago(num_years, end):
return num_years - 1
else:
return num_years
[如果您要检查某人是否18岁,由于using年,在某些极端情况下使用timedelta
将无法正常工作。例如,某位出生于2000年1月1日的人将在2018年1月1日正好6575天后(包括5个leap年)年满18岁,但是某位2001年1月1日出生的人将在1月1日后6574天后正好18岁2019(包括4个leap年)。因此,如果您的年龄恰好是6574天,就无法确定他们是17岁还是18岁,而无需知道更多有关其出生日期的信息。
首先,在最详细的级别上,无法完全解决问题。年份长短不一,对于年份长短,没有明确的“正确选择”。
这里有一个更新的DOB函数,它以与人类相同的方式计算生日:
获得天数,然后除以365.2425(平均公历年)为年。除以30.436875(平均公历月)为月份。
您需要的精确度如何?如果您担心leap年,td.days / 365.25
将使您非常接近。
def age(dob):
import datetime
today = datetime.date.today()
if today.month < dob.month or \
(today.month == dob.month and today.day < dob.day):
return today.year - dob.year - 1
else:
return today.year - dob.year
>>> import datetime
>>> datetime.date.today()
datetime.date(2009, 12, 1)
>>> age(datetime.date(2008, 11, 30))
1
>>> age(datetime.date(2008, 12, 1))
1
>>> age(datetime.date(2008, 12, 2))
0
然而这里未提到的另一个第三方库是mxDateTime(python datetime
和第三方timeutil
的前身)可以用于此任务。
最后,您所拥有的是一个数学问题。如果每隔4年我们有额外的一天,那么可以在几天之内(而不是365天,而是365 * 4 + 1)潜水timedelta,那么您的时间就是4年。然后再将其除以4。timedelta /((365 * 4)+1)/ 4 = timedelta * 4 /(365 * 4 +1)
这是我制定的解决方案,希望能对您有所帮助;-)
即使此线程已经死了,我还是可以针对我面临的这个同样的问题提出可行的解决方案。在这里(日期是格式为dd-mm-yyyy的字符串):
此函数返回两个日期之间的年差(以ISO格式作为字符串,但可以轻松修改以采用任何格式)
我会建议Pyfdate
import datetime
def check_if_old_enough(years_needed, old_date):
limit_date = datetime.date(old_date.year + years_needed, old_date.month, old_date.day)
today = datetime.datetime.now().date()
old_enough = False
if limit_date <= today:
old_enough = True
return old_enough
def test_ages():
years_needed = 30
born_date_Logan = datetime.datetime(1988, 3, 5)
if check_if_old_enough(years_needed, born_date_Logan):
print("Logan is old enough")
else:
print("Logan is not old enough")
born_date_Jessica = datetime.datetime(1997, 3, 6)
if check_if_old_enough(years_needed, born_date_Jessica):
print("Jessica is old enough")
else:
print("Jessica is not old enough")
test_ages()