业务场景:

我们经常会跑一些月级别或者周级别的报表。

周级别的报表还比较好确定,就是七天前的直接用timedelta(days=7)来获取开始日期就可以了;

但是月级别的报表就要麻烦一些,因为timedelta这个函数没有month这个参数,那我们怎么来获取一个月前的一号呢,还要考虑到这个月有多少天,会不会跨年,之类的...

我今天想到了一个简单的办法,分享给大家

有了这个办法,就不用再去判断闰年那些很麻烦的逻辑了

如果大家发现这个算法有什么问题可以指出来,共同学习

 from datetime import date
from datetime import timedelta def get_last_month_first_day(date):
date_terminal = 26 + date.day
res_date = date - timedelta(days=date_terminal)
while 1:
if res_date.day == 1:
break
else:
res_date -= timedelta(days=1)
return res_date if __name__ == '__main__':
test_date_a = date(2016, 9,3)
test_date_b = date(2016, 10, 1)
test_date_c = date(2016, 2, 28)
test_date_d = date(2016, 1, 1)
print map(get_last_month_first_day, [
test_date_a, test_date_b, test_date_c, test_date_d])

----------------2017-07-16-------------------------

现在再看这道题,我又有了新的办法,对比之前的写法不知道好了多少

def get_last_month_first_day_v2(d):
return datetime.date(d.year - (d.month==1), d.month - 1 or 12, 1)

python中获取上一个月一号的方法的更多相关文章

  1. JS中在当前日期上追加一天或者获取上一个月和下一个月

    /** * 获取上一个月 * * @date 格式为yyyy-mm-dd的日期,如:2014-01-25 */ function getPreMonth(date) { var arr = date. ...

  2. js获取上一个月、下一个月格式为yyyy-mm-dd的日期

    /** * 获取上一个月 * * @date 格式为yyyy-mm-dd的日期,如:2014-01-25 */ function getPreMonth(date) { var arr = date. ...

  3. js获取上一个月、下一个月

    /** * 获取上一个月 * * @date 格式为yyyy-mm-dd的日期,如:2014-01-25 */ function getPreMonth(date) { var arr = date. ...

  4. python获取上一个月第一天0点的unix时间戳

    这两天做统计,需要用到当月第一天0点0分0秒的unix timestamp,上个月第一天0点的unix时间戳,三个月前月第一天的0点的Unix时间戳,六个月前当月第一天的0点的Unix时间戳,现在整理 ...

  5. php时间:获取上一个月,本月天数,下一个月

    时间戳转日期 date() 日期转时间戳 strtotime() 当前时间戳time() 获取当前月的天数: $i=; $y=; echo date("t",strtotime(& ...

  6. Shell获取上一个月、星期的时间范围

    #!/bin/bash date_today=`date -d '1 day ago' +%Y%m%d`   #最近7天 date_befor_7day=`date -d '7 day ago' +% ...

  7. javascript按照指定格式获取上一个月的日期

    //get pre month//get pre month function getPreMonth() { var date=new Date().Format("yyyy-MM-dd& ...

  8. php自动获取上一个月的起始时间

    1.借鉴评论的方法[20170309 edit] function get_month_start_end($timestamp) { !empty($timestamp) OR $timestamp ...

  9. js计算当前日期上一个月和下一个月

    /**         * 获取上一个月         *         * @date 格式为yyyy-mm-dd的日期,如:2014-01-25         */        funct ...

随机推荐

  1. 1月12日,HTML学习笔记2

    妈蛋,这两天看HTML看上瘾了,感觉这玩意有点简单,反馈期太短了,我的python都荒废了/(ㄒoㄒ)/~~. 不多说了,把记录贴上来,到时过几天再拿出来整理一下,写上注释,顺便当做复习 去研究css ...

  2. 偶然翻出很久很久以前写的一款sqlmap UI,有点年头了

  3. 用帝国CMS时遇到的问题

    今天用帝国CMS时出现了如下提示: Table 'tuanwei.phome_ecms_twnews_index' doesn't exist delete from ***_ecms_t 删除栏目时 ...

  4. python小知识点

    问题:求列表中每个元素的元素次方之和>>> a=[1,2,3,4]>>> k=len(a)第一种解法#    s=0#    for x in a:#        ...

  5. Mysql与Oracle区别

    1.Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源的而Oracle价格非常高. 2.Oracle支持大并发,大访问量 ...

  6. 创建COM对象时遭遇 800702e4

    SolidEdge st5(x64) SDK /vs2012/win8.1 x64 西夏普创建SEApplication COM对象时遭遇800702e4.翻来覆去的调vs进程的权限,调se进程的权限 ...

  7. HTTP POST 提交问题

    最近用http+post方式实现了系统间数据交互的需求. 常用的方式是 application/json方式直接post json对象 . 告诉服务器数据格式将会是 { Name : 'John Sm ...

  8. 兵家必争之地——关于O2O商业模式的一点遐想

    先来说说什么是O2O(online to offline)商业模式.创新工场CEO李开复在提及O2O模式时指出,“你如果不知道O2O至少知道团购,但团购只是冰山一角,只是第一步”.O2O营销模式又称离 ...

  9. 无索引状态下比较DataTable的几种过滤方法效率

    先构造一个DataTable: public DataTable GetDataTable() { DataTable dtTmp = new DataTable(); dtTmp.Columns.A ...

  10. AMap地图加载完成事件

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...