ism*_*han 8 python datetime python-3.x python-datetime
如果我想在我的程序中添加100年,为什么它显示错误的日期?
import datetime
stringDate= "January 10, 1920"
dateObject= datetime.datetime.strptime(stringDate, "%B %d, %Y")
endDate= dateObject+datetime.timedelta(days=100*365)
print dateObject.date()
print endDate.date()
Run Code Online (Sandbox Code Playgroud)
jfs*_*jfs 12
要执行句点(日历)算术,您可以使用 dateutil.relativedelta:
#!/usr/bin/env python
from datetime import date
from dateutil.relativedelta import relativedelta # $ pip install python-dateutil
print(date(1920, 1, 10) + relativedelta(years=+100))
# -> 2020-01-10
Run Code Online (Sandbox Code Playgroud)
要了解,为什么d.replace(year=d.year + 100)失败,请考虑:
print(date(2000, 2, 29) + relativedelta(years=+100))
2100-02-28
Run Code Online (Sandbox Code Playgroud)
请注意,这2100不是闰年,2000而是闰年.
如果您要添加的唯一单位是年份,则可以仅使用stdlib实现它:
from calendar import isleap
def add_years(d, years):
new_year = d.year + years
try:
return d.replace(year=new_year)
except ValueError:
if (d.month == 2 and d.day == 29 and # leap day
isleap(d.year) and not isleap(new_year)):
return d.replace(year=new_year, day=28)
raise
Run Code Online (Sandbox Code Playgroud)
例:
from datetime import date
print(add_years(date(1920, 1, 10), 100))
# -> 2020-01-10
print(add_years(date(2000, 2, 29), 100))
# -> 2100-02-28
print(add_years(date(2000, 2, 29), 4))
# -> 2004-02-29
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 10
您不能只添加100*365天,因为在该时间跨度内有366天的闰年.在你100年的时间里,你错过了25天.
最好只使用这里的datetime.replace()方法:
endDate = dateObject.replace(year=dateObject.year + 100)
Run Code Online (Sandbox Code Playgroud)
这可能在2月29日的闰年仍然失败,因为根据您添加的年数,您最终会得到无效的日期.你可以在那种情况下回到2月28日,或者使用3月31日; 处理抛出的异常并切换到您选择的替换:
years = 100
try:
endDate = dateObject.replace(year=dateObject.year + years)
except ValueError::
# Leap day in a leap year, move date to February 28th
endDate = dateObject.replace(year=dateObject.year + years, day=28)
Run Code Online (Sandbox Code Playgroud)
演示:
>>> import datetime
>>> dateObject = datetime.datetime(1920, 1, 10, 0, 0)
>>> dateObject.replace(year=dateObject.year + 100)
datetime.datetime(2020, 1, 10, 0, 0)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11757 次 |
| 最近记录: |