文档章节

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

 异彩飞天
发布于 2017/05/24 08:53
字数 432
阅读 29
收藏 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 datetime 增加月份的问题

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

农村程序员
2012/08/31
0
1
Python刷题提升——第一季(题目篇)

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

ID王大伟
05/05
0
0
python高性能编程第一章读书笔记

计算机底层组件分为三大基本部分:计算单元、存储单元以及两者之间的连接。 计算单元:具有将接收到的任意输入转换成输出的能力以及改变当前处理状态的能力。CPU是最常见的计算单元。它的主要...

ma412410029
05/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

git +STS使用问题解决一

1. 2.点以一个pull就是更新代码 3.synchronize workSpace 同步代码,同SVN一致

森火
4分钟前
0
0
powerBi odbc 连接impala 实现自助分析

配置Impala以使用ODBC 可以将第三方产品设计为使用ODBC与Impala集成。为获得最佳体验,请确保支持您打算使用的任何第三方产品。验证支持包括检查Impala,ODBC,操作系统和第三方产品的版本是...

hblt-j
9分钟前
0
0
Purism FAQ

<font size="37" color="#006248" face="幼圆"> <p align="center"> Purism FAQ </p> </font> 原文:https://puri.sm/faq/ 原作者:Purism Team 翻译者:冰焰火灵X 1079092922@qq.com 文章许......

ICE冰焰火灵X
24分钟前
0
0
nginx+webdav

1、配置Nginx以支持WebDav: Webdav是nginx一个组件,默认编译nginx时是没有安装这个组件的。 如果跟应用公用一个nginx,需要重新编译安装nginx,重新安装前需要备份好原来的nginx.conf。 1....

yaukie
30分钟前
0
0
spring 事件

ContextRefreshedEvent Event raised when an {@code ApplicationContext} gets initialized or refreshed. ContextClosedEvent Event raised when an {@code ApplicationContext} gets clos......

Canaan_
41分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部