博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 当前时间增加或减少一个月
阅读量:6270 次
发布时间:2019-06-22

本文共 1315 字,大约阅读时间需要 4 分钟。

hot3.png

问题

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

ValueError: day is out of range for month

看一下代码:

import datatimedef _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 datetimefrom dateutil.relativedelta import relativedeltaif __name__ == "__main__":    print(datetime.date.today() - relativedelta(months=+1))

可以看出,主要是使用relativedelta类。初始化参数months是月的差异。如果想增加一个月,那么就变成datetime.date.today() + relativedelta(months=+1),就是减号变加号。

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


源码分析

代码在

判断应该是在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://my.oschina.net/u/733473/blog/870206

你可能感兴趣的文章
bzoj 2127: happiness
查看>>
Python 3.5 之路 day1
查看>>
selenium使用chrome抓取自动消失弹框的方法
查看>>
实现strStr()---简单
查看>>
只有PD号的调起
查看>>
返回一个整数数组中最大子数组的和
查看>>
leetcode(二)
查看>>
利用css实现居中的方法
查看>>
Spring + Hibernate 框架
查看>>
添加浏览器的用户样式表
查看>>
LigerUI学习笔记之布局篇 layout
查看>>
LeetCode题解(二)
查看>>
Mybatis通用Mapper
查看>>
文件磁盘命令(就该这么学6章内容)
查看>>
2016-207-19 随笔
查看>>
java的double类型如何精确到一位小数?
查看>>
看看国外的javascript题目,你能全部做对吗?
查看>>
ffmpeg 如何选择具有相同AVCodecID的编解码器 (AVCodec)
查看>>
真正解决 Windows 中 Chromium “缺少 Google API 密钥” 的问题
查看>>
Spring 之 AOP
查看>>