问题

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

ValueError: day is out of range for month

看一下代码:

import datatime
def _last_month(now_time):last_month = now_time.month - 1last_year = now_time.yearif last_month == 0:last_month = 12last_year -= 1month_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 relativedeltaif __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) <= 12month += self.monthsif month > 12:year += 1month -= 12elif month < 1:year -= 1month += 12day = min(calendar.monthrange(year, month)[1],self.day or other.day)

参考:
https://dateutil.readthedocs.io/en/stable/
https://github.com/dateutil/dateutil

@完

转载于:https://www.cnblogs.com/zhangqunshi/p/6641167.html

Python 如何计算当前时间减少或增加一个月相关推荐

  1. python datetime 加一个月_Python 如何计算当前时间减少或增加一个月

    问题 今天在之前的代码中发现了一个bug,有个计算当前时间减少一个月的函数,其报出下面的异常信息: ValueError: day is out of range for month 看一下代码: i ...

  2. python 加一个月 日期,有没有一种简单的方法可以在Python中将datetime对象增加一个月?...

    本问题已经有最佳答案,请猛点这里访问. 所以我试图找到一种方法,将日期时间对象增加一个月.然而,根据这个问题,这似乎不是那么简单. 我希望有这样的事情: import datetime as dt n ...

  3. php date 加月_php如何使时间增加一个月

    php如何使时间增加一个月 使用php的strtotime()函数 实例:比如现在时间5261是"2010-10-06",加4102一个月.1653echo date(" ...

  4. java new date 减一天_java日期增加一个月或减少一天

    我们在java开发中,遇到一个Date类型的日期,希望在它基础上增加一个月,赋值给另外一个变量,这个时候该如何处理 /**** * 传入具体日期 ,返回具体日期增加一个月. * @param date ...

  5. python入门到精通需要学多久-Python从入门到精通只需要一个月就够了!

    对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握 Python 看似是一件十分困难的事.其实,只要掌握了科学的学习方法并制定了合理的学习计划,Python 从 入门到精通只需要一个月就够了! ...

  6. python从入门到精通需要多久-Python从入门到精通只需要一个月就够了!

    对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握 Python 看似是一件十分困难的事.其实,只要掌握了科学的学习方法并制定了合理的学习计划,Python 从 入门到精通只需要一个月就够了! ...

  7. python入门到精通需要学多久-Python零基础入门到精通:一个月就够了

    毫无疑问,Python是目前最热门的编程语言之一.对于许多从未参与过计算机编程的"小白"来说,深入掌握Python似乎非常困难.事实上,只要你掌握了科学的学习方法,制定了合理的学习 ...

  8. 江苏python二级考试时间,江苏2021年3月计算机二级考试报名时间安排

    2021年3月江苏全国计算机二级考试报名时间已经公布.以下是小编为大家整理的2021年3月江苏计算机二级考试报名时间相关内容,希望对大家有所参考与帮助. 江苏2021年3月计算机二级考试报名时间 20 ...

  9. java当前日期加一个月_用代码实现使当前日期 Date型的数据增加一个月

    展开全部 Calendar cal = Calendar.getInstance(); //下面的就是把当前日期加一个月 cal.add(Calendar.MONTH, 1) SimpleDateFo ...

最新文章

  1. python程序设计祁瑞华答案_【单选题】有六个元素 6 , 5 , 4 , 3 , 2 , 1 的顺序进栈,问下列哪一个不是合法的出栈序列? (2.0分)...
  2. 关于64位 MS SQL 导入导出 Oracle 引发 ORA-06413 的解决方法
  3. SAP PR 转 PO
  4. Unity进阶技巧 - 从文件读取游戏数据
  5. Hystrix简介及简单代码示例
  6. 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波9 - 直方图处理 - 直方图匹配(规定化)灰度图像,彩色图像都适用
  7. 计算机更新阶段,较旧的计算机开始自动升级到Windows10 2004版
  8. php/eq,thinkphp中eq标签的使用
  9. 推荐给初学LSTM或者懂个大概却不完全懂的人
  10. Google搜索简单介绍
  11. 高中计算机思维导图,为高中信息技术教学插上思维导图翅膀
  12. 菠萝狗四足机器人使用手册
  13. c语言转换字符类型,C语言基础之数据类型转换
  14. google talk
  15. Matlab之inv函数
  16. linux通过文件修改密码,如何通过Linux系统来修改密码
  17. 关于pip安装gap_statistic
  18. Python爬虫:调用百度翻译接口实现中英翻译功能
  19. 暴力破解工具——Hydra使用教程
  20. springcloud篇】九. springcloud项目 三 首页,我的信息,添加好友及好友信息处理

热门文章

  1. nyoj 715 Adjacent Bit Counts
  2. Discuz x3论坛使用CDN后获取真实IP的解决方法
  3. Kprobe在Linux kernel debug中的应用
  4. 读于丹《趣品人生》有感
  5. 自动生成用户名,密码的方法
  6. python猜数字游戏编程、最后显示猜了几次_用Python完成猜数字游戏
  7. pods install 无法安装库
  8. Xamarin Essentials教程屏幕常亮ScreenLock
  9. DNS枚举工具DNSenum
  10. idea查看ruby代码_Ruby实现命令行中查看函数源码的方法