文档章节

python 计算两个日期相差多少个月

 异彩飞天
发布于 2017/05/24 08:53
字数 432
阅读 36
收藏 0

近期,由于业务需要计算两个日期之前相差多少个月。我在网上找了很久,结果发现万能的python,居然没有一个模块计算两个日期的月数,像Java、C#之类的高级语言,都会有(date1-date2).months的现成方法,觉得不可思议。说句实在的,一直觉得python 的日期处理模块真心不好用。

  哦,对了,别跟我说 datetime, calendar, dateutil 这些模块,因为我都试过了,都没用。有个竟然算出来还有错。datetime.timedelta只能计算出日时分秒。对年月却不支持。网上一搜,一大堆的。

  dateutil.rrule这个例子是我好不容易找到的,请看我的测试结果:

import datetime

from dateutil import rrule

d1 = datetime.date(2016, 2, 29)
d2 = datetime.date(2019, 3, 31)

months = rrule.rrule(rrule.MONTHLY, dtstart=d1, until=d2).count()

print(f"months={months}")

  看到这样的结果,我只能呵呵了。

  废话不多少,献上自己写的代码:

  该代码返回,(月,小数月)

import datetime
import calendar as c


d1 = datetime.date(2016, 2, 29)
d2 = datetime.date(2019, 3, 31)


def calmonths(startdate, enddate):
# 计算两个日期相隔月差
samemonthdate = None
try:
samemonthdate = datetime.date(enddate.year, enddate.month,
startdate.day)
except Exception as e:
print(e)
samemonthdate = datetime.date(enddate.year, enddate.month,
c.monthrange(enddate.year,
enddate.month)[1])


    holdmonths = 0
    decimalmonth = 0.0
    if samemonthdate > enddate:
        premanthdate = None
        try:
            premanthdate = datetime.date(enddate.year, enddate.month - 1,
                                             startdate.day)
        except Exception as e:
            print(e)
            premanthdate = datetime.date(enddate.year, enddate.month - 1,
                                             c.monthrange(
                                                 enddate.year,
                                                 enddate.month - 1)[1])
        currmonthdays = (samemonthdate - premanthdate).days
        holdmonths = (premanthdate.year - startdate.year
                      ) * 12 + premanthdate.month - startdate.month
        decimalmonth = (enddate - premanthdate).days / currmonthdays




    elif samemonthdate < enddate:
        nextmonthdate = None
        try:
            nextmonthdate = datetime.date(enddate.year, enddate.month + 1,
                                              startdate.day)
        except Exception as e:
            nextmonthdate = datetime.date(enddate.year, enddate.month + 1,
                                              c.monthrange(
                                                  enddate.year,
                                                  enddate.month + 1)[1])
        currmonthdays = (nextmonthdate - samemonthdate).days
        holdmonths = (samemonthdate.year - startdate.year
                      ) * 12 + samemonthdate.month - startdate.month
        decimalmonth = (enddate - samemonthdate).days / currmonthdays




    else:
        holdmonths = (enddate.year - startdate.year
                      ) * 12 + enddate.month - startdate.month




    return holdmonths, decimalmonth




months = calmonths(d1, d2)




print(f"months={months}")

欢迎各种暴力测试,有问题留言反馈。

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 2
码字总数 837
作品 0
广州
6 个 Python 的日期时间库

在 Python 中有许多库可以很容易地测试、转换和读取日期和时间信息。 这篇文章是与 Jeff Triplett 一起合写的。 曾几何时,我们中的一个人(Lacey)盯了一个多小时的 Python 文档中描述日期和...

16%
05/22
0
0
几道Python小程序练习的多种解法,做出来就表示Python入门了!

下面由小编开始设题解题: python斐波那契数列 关于Python编程练习题和答案,斐波那契数列应用的示例。引用百度关于斐波那契数列的介绍,大家先简单来的了解下,什么是斐波那契数列? 斐波那...

Python新世界
07/21
0
0
Python刷题提升——第一季(题目篇)

博客写了一年多了,也积攒了100+文章分享 感谢大家陪我一起学习 每次在评论区看到你们的疑问和鼓励,我甚是欣慰 在部分文章最后留有一些问题,大家都会踊跃给出自己的答案 除了之前的Python数...

ID王大伟
05/05
0
0
python datetime 增加月份的问题

我的主要工作是从事.net开发,记得.net中有相应的对DateTime月份加减操作。然而在学习python datetime类型的时候却发现对月份没有相应操作。 在python中对datetime类型的操作主要涉及到两个对...

农村程序员
2012/08/31
0
1
实用又强大,6 款 Python 时间&日期库推荐

在使用 Python 的开发过程中,除了使用 datetime 标准库来处理时间和日期,还有许多第三方的开源库值得尝试。 1、Arrow Arrow 是一个专门处理时间和日期的轻量级 Python 库,它提供了一种合理...

编辑部的故事
2017/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
今天
1
0
AVA中CAS-ABA的问题解决方案AtomicStampedReference

了解CAS(Compare-And-Swap) CAS即对比交换,它在保证数据原子性的前提下尽可能的减少了锁的使用,很多编程语言或者系统实现上都大量的使用了CAS。 JAVA中CAS的实现 JAVA中的cas主要使用的是...

码代码的小司机
今天
2
0
Android JNI开发系列(十三) JNI异常处理

JNI 异常处理 JNI异常与JAVA处理异常的区别 JAVA 有异常处理机制,而JNI没有 如果JAVA中异常没有捕获,后面的代码不会执行,JNI会执行 JAVA编译时的异常,是在方法显示的声明了某一个异常,编...

蔡小鹏
今天
2
0
简单介绍Java 的JAR包、EAR包、WAR包区别

WAR包 WAR(Web Archive file)网络应用程序文件,是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。War专用于Web方面。大部分的JAVA WEB工程,都是打成WAR包进行发布的。 War是...

Linux就该这么学
今天
3
0
Qt那些事0.0.7

在帮助文档(Overview - QML and C++ Integration)中随缘遇到一张图,是关于C++对象与QML整合介绍的,值得标记下来,虽然大部分功能也有所涉猎,但是还是留个记号,万一哪天我失忆了还想写Q...

Ev4n
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部