问题

今天在之前的代码中发现了一个bug,有个计算当前时间减少一个月的函数,其报出下面的异常信息:

ValueError: day is out of range for month

看一下代码:

import datatime
def _last_month(now_time):
last_month = now_time.month - 1
last_year = now_time.year
if last_month == 0:
last_month = 12
last_year -= 1
month_time = datetime.datetime(month=last_month, year=last_year, day=now_time.day)
return month_time

原因

问题出现在day=now_time.day上。后来想了一下,发现问题原因是3月30日减少一个月是2月30日,而2月没有30日,所以就抛出了上面的异常信息。


解决办法

对于日期操作,网上的写法都不太一样,而且不确定存在什么bug。日期函数是靠时间来验证的,没准一年以后就出现了(我这个bug是在指定的3月29日以后才能出现,神奇不:D)。

所以我找了一个现有的日期扩展库,希望别人已经踩过大部分坑了。代码如下

import datetime
from dateutil.relativedelta import relativedelta if __name__ == "__main__":
print(datetime.date.today() - relativedelta(months=+1))

可以看出,主要是使用relativedelta类。初始化参数months是月的差异。

安装这个库也很简单,执行命令pip install python-dateutil


源码分析

代码在

https://github.com/dateutil/dateutil/blob/master/dateutil/relativedelta.py

判断应该是在354行开始:

if self.months:
assert 1 <= abs(self.months) <= 12
month += self.months
if month > 12:
year += 1
month -= 12
elif month < 1:
year -= 1
month += 12
day = min(calendar.monthrange(year, month)[1],
self.day or other.day)

参考:

https://dateutil.readthedocs.io/en/stable/

https://github.com/dateutil/dateutil

@完

最新文章

  1. C#抽象方法和虚拟方法理解
  2. 搭建一个SSH项目框架的步骤
  3. Java mac 上编写Java代码
  4. CocoaPods安装第三方出错:XCode7.3
  5. hdu 5363 组合数学 快速幂
  6. ActiveMQ集成到Spring
  7. C++ union 公共体
  8. Buddy system伙伴分配器实现
  9. css架构目标:预测,重用,扩展,维护
  10. js实现类似于add(1)(2)(3)调用方式的方法
  11. [原创]MySQL数据库忘记root密码解决办法
  12. YII2 添加全局自定义函数
  13. MyEclipse下安装FatJar打包工具
  14. 关于“System.Data.OleDb.OleDbException,外部数据库驱动程序 (1) 中的意外错误。”的解决方案
  15. 基于NetMQ的TLS框架NetMQ.Security的实现分析
  16. Spring Boot 2.0 图文教程 | 集成邮件发送功能
  17. 加号变空格问题 url参数 post get 请求发送
  18. My To Do List (Task Manager)
  19. PAT 甲级 1141 PAT Ranking of Institutions
  20. MATLAB数学实验总结

热门文章

  1. [LeetCode 题解]: Two Sum
  2. Arduino I2C + 气压传感器LPS25H
  3. TSQL--NESTED LOOPS JOIN
  4. C# 二维码生成——QRCode
  5. webUploader 的使用
  6. c# 与 Mysql 的通讯方式总结
  7. 搜索下拉 select美化
  8. WEB新手之sql注入
  9. software installing
  10. iOS 进阶---推送通知之本地通知