我发现了非常有用的datetime。在处理日期时,datetime对象,但是我现在的情况是。约会时间不适合我。在程序执行期间,day字段是动态计算的,问题是:
>>> datetime.datetime(2013, 2, 29, 10, 15)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: day is out of range for month
好吧,二月没有29天,但如果datetime能算出来并返回这个对象就太好了
datetime.datetime(2013, 3, 1, 10, 15)
解决这种情况的最好方法是什么?所以,我在寻找一个通解,当day参数大于month的天数
来自Python的禅意:显式优于隐式。当你犯了一个错误,比如试图创建一个无效的日期,你需要显式地处理这种情况。
如何处理异常完全取决于你的应用程序。您可以将错误通知最终用户,也可以尝试将日期移到下一个月,或者将日期限制在当前月份的最后一个法定日期。这些都是有效的选项,取决于你的用例。下面的代码将把"盈余"天数转移到下一个月。因此,2013-02-30将改为2013-03-02。
import calendar
import datetime
try:
dt = datetime.datetime(year, month, day, hour, minute)
except ValueError:
# Oops, invalid date. Assume we can fix this by shifting this to the next month instead
_, monthdays = calendar.monthrange(year, month)
if monthdays < day:
surplus = day - monthdays
dt = datetime.datetime(year, month, monthdays, hour, minute) + datetime.timedelta(days=surplus)
虽然在这种情况下使用try...except
有很多要说的,但如果您真的只需要month + dayoffset,您可以这样做:
d = datetime.datetime(targetYear,targetMonth,1,hour,min,sec)
d = d + datetime.timedelta(days=targetDayOfMonth-1)
基本上,将每月的第几天设置为1,它总是在月份中,然后添加timedelta以返回当前或未来月份中的适当日期。
d = datetime.datetime(2013, 2, 1, 10, 15) # day of the month is 1
# since the target day is the 29th and that is 28 days after the first
# subtract 1 before creating the timedelta.
d = d + datetime.timedelta(days=28)
print d
# datetime.datetime(2013, 3, 1, 10, 15)
使用下个月的第一天,然后减去一天,以避免使用日历
datetime.datetime(targetYear, targetMonth+1, 1) + dt.timedelta(days = -1)