文档章节

python datetime 增加月份的问题

程序猿刚子
 程序猿刚子
发布于 2012/08/31 09:35
字数 601
阅读 12935
收藏 2

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

在python中对datetime类型的操作主要涉及到两个对象,1.datetime 2.timedelta 其中后者为一个时间差对象。相当于.net中的TimeSpan类对象。

 在我的开发中需要对日期进行月份加减的过程中,我理所当然的找到了timedelta,然而发现这个类中没有对月份的参数,它的定义如下:

 class datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]]) 于是网上找到一些解决办法: 

def add_months(dt,months):
    targetmonth=months+dt.month
    try:
        dt=dt.replace(year=dt.year+int(targetmonth/12),month=(targetmonth%12))
    except:
        dt=dt.replace(year=dt.year+int((targetmonth+1)/12),month=((targetmonth+1)%12),day=1)
        dt+=datetime.datetime.timedelta(days=-1)
    return dt

  总体的思路就是: 拿出给定时间的月份加上指定个月,超过一年在年上+1, 月份取模后余值。这里就设计到一个问题:如果8月31日加1月的话,那么就会变成9月31日,显然9月不存在31日,该方案是在异常的时候对这种情况进行了处理。(取下月的第一天,然后减去一天) 

本来已经实现了,后来无聊琢磨着这个事情,所谓的加一个月或者几个月我们想得到的是什么?因为月份不是个固定的数量,应该是这个原因python把具体的实现留给了我们把。

 +1月,我们要得到的是下月的这天,对于月末的一天,如我们距离的8月31日,如果+1月,应该得到9月31日,由于这天不存在所以我们取9月末的30号为结果。这样就出现了8月30日、8月31日+1月的结果都是9月30日的结果。(用.net的AddMonths验证结果也如此)。 

在上面给出的解决办法中,由于要抛异常,显然不是个很好的办法,下面给出几种其他办法:

 1.自己实现,没有了抛异常的部分 

def add_months(dt,months):
    month = dt.month - 1 + months
    year = dt.year + month / 12
    month = month % 12 + 1
    day = min(dt.day,calendar.monthrange(year,month)[1])
    return dt.replace(year=year, month=month, day=day)

 2.利用其他人实现的日期操作包, 如dateutil

© 著作权归作者所有

上一篇: base64编解码
程序猿刚子
粉丝 14
博文 18
码字总数 7972
作品 0
丰台
高级程序员
私信 提问
加载中

评论(1)

r
richiard
这个和闰年无关吗,calender自动处理了?
学习笔记(11月09日)--import&datetime

四周四次课(11月9日) 在日常的开发工作中,我们要写很多的python代码,如果都写在一个文件中,会导致代码特别难维护,为了拓展代码的可维护性,我们把函写在不同的文件里,这样每个文件包含...

wanyang_wanyang
2018/07/03
0
0
6 个 Python 的日期时间库

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

16%
2018/05/22
0
0
python中的datetime模块

Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime。time模块我在之前的文章已经有所介绍,它提供的接口与C标准库time.h基本一致。相比于time模块,datetime模块的接口...

指尖跳动的精灵
2015/04/08
29.3K
0
python datetime、time、date

python datetime Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime。time模块我在之前的文章已经有所介绍,它提供的接口与C标准库time.h基本一致。相比于time模块,d...

taote
2013/05/14
24.4K
0
Linux下将python2.6升级到2.7 yum修复及pip安装

Linux下将python2.6升级到2.7 安装pip 以及升级中遇到问题的解决方法 python2.6版本有很多局限性:最重要的就是,当前最新的pip版本已经不再支持python2.6;这给我们安装很多python库增加了很...

蚂蚁-Declan
04/04
72
0

没有更多内容

加载失败,请刷新页面

加载更多

Experts say the weaker pound is drawing investors to the UK tech sector

UK tech companies secured a record £5.5bn in foreign investment in the first seven months of this year, research shows. This was more than the amount invested per capita in th......

wowloop
18分钟前
5
0
Add support for Android 9-patch images in BorderImage

The 9-patch image implementation in Qt Quick Controls 1 is an internal implementation detail of the Android style. It cannot handle .9.png image files out of the box, but takes ......

shzwork
23分钟前
4
0
c/c++日期时间处理函数小结

日期时间处理函数: 日期时间转为字符串 strftime/std::put_time 字符串解析成日期时间 strptime/std::get_time 时间结构转换:time_t->tm localtime:time_t->tm 时间结构转换:tm->time_t ...

chuqq
27分钟前
5
0
Apache Flink 进阶入门(二):Time 深度解析

前言 Flink 的 API 大体上可以划分为三个层次:处于最底层的 ProcessFunction、中间一层的 DataStream API 和最上层的 SQL/Table API,这三层中的每一层都非常依赖于时间属性。时间属性是流处...

大涛学长
28分钟前
3
0
创龙基于Xilinx Artix-7系列FPGA处理器

SOM-TLA7是一款由广州创龙基于Xilinx Artix-7系列FPGA自主研发的核心板,可配套广州创龙Artix-7开发板使用。核心板尺寸仅70mm*50mm,采用沉金无铅工艺的10层板设计,专业的PCB Layout保证信号...

Tronlong创龙
34分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部