Python 如何计算当前时间减少或增加一个月
问题
今天在之前的代码中发现了一个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
@完
Python 如何计算当前时间减少或增加一个月的更多相关文章
- Python 日历模块calendar.monthrange 获取某一个月有多少天
import calendar monthRange = calendar.monthrange(2018, 10) (0, 31) 输出的是一个元组: 第一个元素,数字0是这个月的第一天是星期天(上 ...
- php时间:获取上一个月,本月天数,下一个月
时间戳转日期 date() 日期转时间戳 strtotime() 当前时间戳time() 获取当前月的天数: $i=; $y=; echo date("t",strtotime(& ...
- Python 从入门到精通:一个月就够了
毫无疑问,Python 是当下最火的编程语言之一.对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握 Python 看似是一件十分困难的事.其实,只要掌握了科学的学习方法并制定了合理的学习计划, ...
- java日期在今天的基础上加一个月。并计算时间相差天数
Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.MONTH, 1); ...
- Python日期和时间
日期和时间主要有两个库,datetime和time. datetime: 日期:datetime.date.today() 日期和时间:datetime.datetime.now() 1000天之后: ...
- 探索 Python、机器学习和 NLTK 库 开发一个应用程序,使用 Python、NLTK 和机器学习对 RSS 提要进行分类
挑战:使用机器学习对 RSS 提要进行分类 最近,我接到一项任务,要求为客户创建一个 RSS 提要分类子系统.目标是读取几十个甚至几百个 RSS 提要,将它们的许多文章自动分类到几十个预定义的主题领域 ...
- 二、Python系列——time时间格式的转换及计算
# -*- coding:utf-8 -*- import pandas as pd import time import datetime start_date = '2020-06-08' # 一 ...
- 【转】Python 日期和时间
本文转自:http://www.runoob.com/python/python-date-time.html Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能. Pytho ...
- python中的时间处理函数
Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime.time模块我在之前的文章已经有所介绍,它提供 的接口与C标准库time.h基本一致.相比于time模块 ...
随机推荐
- .net 可选参数和命名参数
可选参数,可以为方法的参数设置默认值,在调用方法的时候,如果不传递参数,就是执行默认参数. class Program { , string s = "A", DateTime d ...
- java外观模式
外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口 ...
- LoadRunner10个用户并发测试时分别取不同的参数运行脚本
使用场景,比如说10个用户使用不同的账户名和密码同时并发登录,此时选择如下参数化策略: 参数选择:select next row 选择unique update value on 选择 once 另一 ...
- PostgreSQL按年月日分组
Select EXTRACT(year from cast(joindate as timestamp)) as Year, EXTRACT(month from cast(joindate as t ...
- HTTP杂项
HTTP请求头中的origin, referer和host三个字段的区别 host 描述请求将被发送的目的地,包括,且仅仅包括域名和端口号 在任何类型请求中,request都会包含此header信息. ...
- 原生态js回顶部
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 十,PHP下载文件
1,文件类型 (1)文本文件,如xx.txt. (2)二进制文件,如图片.视频.音频. 2,文件下载流程如下图所示,首先浏览器向服务器发送下载请求,服务器将下载资源读入内存,再通过http将资源返回到 ...
- (php脚本自研分享)•通用型保存网站用户密码到css文件
本文原创作者:Laimooc(原名xoanHn) 很多时候呢,我们拿到一个shell以后,偶尔会遇到密码解不了的情况,用xss收集cookie吧,感觉不方便:利用xss平台劫持表单吧,感觉麻烦,也会担 ...
- Java 之封装
预备知识: public:可以被所有其他类所访问 private:只能被自己访问和修改 protected:自身.子类及同一个包中类可以访问 default:同一包中的类可以访问,声明时没有加修饰符, ...
- Vim Clutch | 面向脚踏板编程
简评:这是使用硬件制作的一个离合器踏板,控制 Vim 的 insert mode 和 normal mode ~ Github 上有个关于 Vim 的项目,项目作者 Aleksandr Levchuk ...