文档章节

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

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

精选30+云产品,助力企业轻松上云!>>>

近期,由于业务需要计算两个日期之前相差多少个月。我在网上找了很久,结果发现万能的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
广州
私信 提问
加载中
请先登录后再评论。
W3C高级算法挑战之python实现

最近在学python,网上很难找到对应的算法题网站,专业算法网站大部分都是国外的,之前在w3cschool看到有三个级别的Javascript脚本算法挑战,尝试用python实现,代码量相对比较少,如果你有更...

osc_ro4r5mh1
2019/03/15
7
0
26道大题python实战练习-习题

Python数学计算,编程练习题实例一: 简述:这里有四个数字,分别是:1、2、3、4 提问:能组成多少个互不相同且无重复数字的三位数?各是多少? Python解题思路分析:可填在百位、十位、个位...

osc_id3h8pjd
04/22
18
0
QuantLib 金融计算——基本组件之 Schedule 类

[TOC] 如果未做特别说明,文中的程序都是 Python3 代码。 QuantLib 金融计算——基本组件之 Schedule 类 类用于构造一个特定的日期列表,例如债券的付息日列表,是 QuantLib 中固定收益类产品...

osc_sd6nmwhn
2018/04/17
6
0
python实现以立春为起点n为周期任意日期所在的日期区间

python实现以立春为起点n为周期任意日期所在的日期区间 需求   话不多说,直接上具体需求。 '''以每年的立春作为起始点,每N天为一个单元,任给一个日期,返回该日期所在单元的起始和结束日...

osc_tn8uhjgi
2019/06/05
1
0
python 如何计算时间差

Python Tip]如何计算时间差 Q:如何方便的计算两个时间的差,如两个时间相差几天,几小时等 A:使用datetime模块可以很方便的解决这个问题,举例如下: >>> import datetime >>> d1 = datetim...

taote
2013/11/22
2.6K
0

没有更多内容

加载失败,请刷新页面

加载更多

redis系列之——一致性hash算法

一致性hash算法你了解吗?什么时候使用?解决什么问题?redis集群模式使用了一致性hash算法了吗? 数据分片(sharding) 分布式数据存储时,经常要考虑数据分片,避免将大量的数据放在单表或...

诸葛小猿
10分钟前
0
0
IMDB是否提供API? [关闭] - Does IMDB provide an API? [closed]

问题: I recently found a movie organizer application which fetches its data from the IMDB database . 最近,我发现了一个电影管理器应用程序,该应用程序从IMDB数据库中获取其数据。 ...

fyin1314
33分钟前
14
0
Elasticsearch系列之Query DSL

1 前言 我们先通过阅读官方文档,了解一下什么是 Query DSL 。 1.1 Query DSL Elasticsearch provides a full Query DSL (Domain Specific Language) based on JSON to define queries. DSL是......

冯文议
35分钟前
20
0
java使用jsoup时绕过https证书验证

java 代码 增加一个工具类 在jsoup获取之前调用此方法 //your codeSSLHelper.init();Connection connect = Jsoup.connect(url).userAgent(USER_AGENT);connect.header("Accept","text/htm......

MeiJM
38分钟前
30
0
6 Message 消息提示框

1 element.js导入message import { Message } from 'element-ui'# 赋值给变量,便于this调用Vue.prototype.$message = Message 2 调用 this.$message.error('错误')类型有:success,w......

书阳
38分钟前
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部