python datetime和time的一些疑惑解答 及 获取上年同期、上月等日期

关于datetime和time有几个疑惑的

1、datetime.datetime.now()——为什么需要两个datetime才能返回当前时间,同样的time只需要time.localtime()

后来明白了datetime.datetime.now()——前一个datetime是py文件的名字,中间的datetime是类名,now是方法

2、格式化输出“%H%M%S”,同样是格式化输出,为什么一个是datetime.datetime.strftime("%H%M%S"),另一个是time.strftime("%H%M%S",time.localtime())

注意datetime.datetime.strftime是类的方法,注意上图,datetime.datetime.now()返回的是一个datetime的实例化对象。所以可以直接使用datetime.datetime.strftime方法

而time.strftime()是time模块的方法,注意下图,time.localtime()返回的是time.struct_time对象,这个对象是没有strftime的方法自然报错,用法time.strftime(格式,时间)

--------------------------------------我是分割线--------------------------------------

下面继续说最近需要使用到的找上年同期数的一些方法思路。

使用到datetime.timedelta日期的加减方法,还有calendar.monthrange()获取本月天数的方法

1、首先分别构造

本月1号datetime——date_now = datetime.datetime(year=year, month=month, day=1) # 构造本月1号datetime

本月最后一天的datetime

2、由于timedelta最大只支持到days参数,本月1号减1就是上月的最后一天,就能得到确定的上月值;本月最后一天+1就是下月的第一天

3、不断重复调用,返回对应月份即可

4、没有加上日day的参数,主要是日的不确定性没想明白该怎么弄比较好,比如20160229的上年同期数应该怎么写,如果有思路的伙伴不妨赐教

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Datetime:2018/7/13 0:54
# Author:Xzs

"""
功能:传入日期类似“201807”格式,年份及月份参数,例如
    date_before("201807", year=1, month=7)——返回上年同期7月前的日期,得到“201612”
    date_after("201807", year=1, month=6)——返回下年同期6月后的日期,得到“202001”
    date_before("201807", year=1, month=0)——上年同期
"""

import datetime
from datetime import timedelta
import calendar

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

# 返回传入日期的上月
def last_one_month(date):
    year = int(date[:4])
    month = int(date[4:])
    date_now = datetime.datetime(year=year, month=month, day=1)  # 构造本月1号datetime
    date_last_month = date_now - timedelta(days=1)  # 上月datetime
    return date_last_month.strftime("%Y%m")

# 返回传入日期的下一个月
def next_one_month(date):
    year = int(date[:4])
    month = int(date[4:])
    a, b = calendar.monthrange(year, month)  # a,b——weekday的第一天是星期几(0-6对应星期一到星期天)和这个月的所有天数
    date_now = datetime.datetime(year=year, month=month, day=b)  # 构造本月1号datetime
    date_next_month = date_now + timedelta(days=1)  # 上月datetime
    return date_next_month.strftime("%Y%m")

def date_before(date, year=None, month=None):
    print u"%s年%s月前的日期是:" % (year if year else "-", month if month else "-"),
    if year >= 1:
        month = 12 * year + month

    if month > 1:
        for m in range(1, month + 1):
            new_date = last_one_month(date)  # 返回上个月,再以上个月为基础,循环计算得到最终月
            date = new_date
    elif month == 1:
        new_date = last_one_month(date)
    elif month == 0:
        new_date = date

    # 如果不输入参数,默认返回本日期
    if year is None and month is None:
        new_date = date
    print new_date
    return new_date

def date_after(date, year=None, month=None):
    print u"%s年%s月后的日期是:" % (year if year else "-", month if month else "-"),
    if year >= 1:
        month = 12 * year + month

    if month > 1:
        for m in range(1, month + 1):
            new_date = next_one_month(date)  # 返回下个月,再以下个月为基础,循环计算得到最终月
            date = new_date
    elif month == 1:
        new_date = next_one_month(date)
    elif month == 0:
        new_date = date

    # 如果不输入参数,默认返回本日期
    if year is None and month is None:
        new_date = date
    print new_date
    return new_date

if __name__ == ‘__main__‘:
    # next_day("20180501",day=5)
    # last_day("20160301",day=1,year=5)
    date_before("201801")
    date_after("201807")

  

  

原文地址:https://www.cnblogs.com/vhills/p/9346399.html

时间: 2024-10-20 17:02:03

python datetime和time的一些疑惑解答 及 获取上年同期、上月等日期的相关文章

OpenLDAP使用疑惑解答及使用Java完成LDAP身份认证

导读 LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务.目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的优化.目录一般用来包含描述性的,基于属性的信息并支持精细复杂的过滤能力.目录一般不支持通用数据库针对大量更新操作操作需要的复杂的事务管理或回卷策略.而目录服务的更新则一般都非常简单.这种目录可以存储包括个人信息.web链结.jpeg图像等各种信息.为了访问存储在目录中的信息,就

JavaEE入职后都在干啥——常见入职疑惑解答

hi,大家好, 伴随着一届又一届的同学毕业,传智播客收集了众多成绩或优秀或一般的就业学员分享的工作经验,是时候给大家从真正开发的角度去聊一聊, 公司实战当中都是用什么技术开发.我们传智播客的学员扮演什么样的角色,以及具体的工作内容~~! 我们发现无论哪个班的同学都会问这样一个问题:"我们没有实际的工作经验,根本就不知道公司里是如何工作的,我认为自己完全不具备两年工作经验的水平."每当听到这样的问题我就十分揪心,然后反复地解答. 咱们毕业1,2年的同学一直都肯定地说传智刚刚毕业的同学技术

zz Python datetime / time conversions

Python datetime / time conversions Date: 2008-11-12  |   Tags: datetime, python   |   3 Comments from datetime import datetime import time #------------------------------------------------- # conversions to strings #----------------------------------

python datetime模块用strftime 格式化时间

python datetime模块用strftime 格式化时间 ? Python 三大神器 这是最后一篇 #!usr/bin/python import datetime datetime.datetime.now() 这个会返回 microsecond.因此这个是我们不需要的.所以得做一下修改 datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") 格式化之后,就得到了我们常见的格式了. 附:strftime参数 strftime

python datetime模块用法

python datetime模块用法 1. 创建naive(无时区信息)的datetime对象 import datetime dt_utc = datetime.datetime.utcnow() dt_utc # datetime.datetime(2019, 2, 1, 10, 53, 34, 145034) dt_utc.tzinfo # None dt_local = datetime.datetime.now() dt_local.tzinfo # None # tzinfo为No

python datetime 与 time模块

time模块 tmie.strptime :将时间字符串转化为时间类型 格式:time.strptime(string[string[, format]) 结果可以利用利用time.tm_year 返回年份,其余雷同. #例子 >>> t = time.strptime("2018-2-2", "%Y-%m-%d")>>> ttime.struct_time(tm_year=2018, tm_mon=2, tm_mday=2, t

python爬虫之反爬虫(随机user-agent,获取代理ip,检测代理ip可用性)

python爬虫之反爬虫(随机user-agent,获取代理ip,检测代理ip可用性) 目录 随机User-Agent 获取代理ip 检测代理ip可用性 随机User-Agent fake_useragent库,伪装请求头 from fake_useragent import UserAgent ua = UserAgent() # ie浏览器的user agent print(ua.ie) # opera浏览器 print(ua.opera) # chrome浏览器 print(ua.chro

python datetime和calendar模块常用功能

一,datetime模块 datetime模块定义了下面这几个类:datetime.date:表示日期的类.常用的属性有year, month, day:datetime.time:表示时间的类.常用的属性有hour, minute, second, microsecond:datetime.datetime:表示日期和时间.datetime.timedelta:表示时间间隔,即两个时间点之间的长度.datetime.tzinfo:与时区有关的相关信息. 1,datetime.datetime对

python datetime模块的日常使用

[10:52:43][[email protected]| ~]# python Python 2.7.12 (default, Jun 27 2017, 11:19:01) [GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>