Python进阶篇:8 内置模块time/datetime/calendar/arrow日期时间

1、time模块

import time
'''时间的表示形式:
1、时间戳:
     以整型或者浮点型表示的是一个以秒为单位的时间间隔,这个时间的基础值是1970年1月1日0时开始计算

2、元组形式
    一种python的数据结构表示,这个元组有9个整型元素,分别表示不同的时间含义:
  year、month(1-12)、day(1-31)、hours(0-23)、minutes(0-59)、seconds(0-59)、weekday(0-6,注意星期一为0)、
  Julian day(1-366):表示当前日期在本年的第几天
  DST flag(-1 or 0 or 1):夏令时格式,0表示正常格式,1表示夏令时,-1表示根据当前的日期时间格式来自动判定。

3、格式化字符串

%a 本地简化星期名称
%A  本地完整的星期名称
%b 本地简化月份名称 
%B 本地完整月份名称
%c  本地响应的日期和时间表示
%d  一个月中的第几天(01到31)
%H  一天中的第几个小时(24小时制,00-23)
%I  一天中第几个小时(12小时制,01-12)
%j  一年中第几天(001-366)
%m  月份01-12
%M  分钟数00-59
%p 本地am或者pm响应符号
%S 秒00-59
%U   一年中的星期数
%w  一个星期中第几天(0-6,0表示星期天)
%W   和%U基本相同
%x  本地相应的日期
%X   本地相应的时间
%y 去掉世纪的年份(00-99)
%Y  完整的年份
%Z  时区的名称,如果不存在为空字符串


'''
# 返回当前的时间戳,浮点数形式,无需传参
t1 = time.time()
print(t1) # 1562748091.1303322

# gmtime()将时间戳转换为UTC时间元组格式,接收一个浮点型时间戳为参数,如果不传默认为当前时间的时间戳
t2 = time.gmtime()
print(t2) # time.struct_time(tm_year=2019, tm_mon=7, tm_mday=10, tm_hour=8, tm_min=45, tm_sec=10, tm_wday=2, tm_yday=191, tm_isdst=0)

# localtime()将时间戳转换为本地时间元组
t3 = time.localtime()
print(t3) # time.struct_time(tm_year=2019, tm_mon=7, tm_mday=10, tm_hour=16, tm_min=45, tm_sec=10, tm_wday=2, tm_yday=191, tm_isdst=0)

# mktime() 将本地时间元组转换为时间戳,接收一个本地时间元组
t4 = time.mktime(t3)
print(t4) # 1562748406.0


# asctime()将时间元组转换为字符串形式,接收一个本地时间元组
t5 = time.asctime(t3)
print(t5) # 返回值类型字符串,Wed Jul 10 16:48:55 2019

# ctime()将时间戳转换为字符串,接收一个时间戳,默认参数为当前时间戳
t6 = time.ctime()
print(t6) # 返回值类型字符串,Wed Jul 10 16:50:11 2019

# strftime()表示string fomate tieme;将时间元组以指定格式转换为字符串形式;第一个参数接收一个字符串格式,第二个参数为时间元组默认为本地的时间元组
t7 = time.strftime("%Y-%m-%d %X",time.localtime()) # %X等同于%H:%M:%S
# t7 = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
print(t7) # 2019-07-11 09:55:30
t7_1 =time.strftime("%x %H:%M:%S",time.localtime())
print(t7_1) # 07/11/19 09:57:27

#strptime():string prase time
#将指定格式的时间字符串转换为时间元组,是strftime的逆过程
t8= time.strptime("1997-07-01 10:12:20","%Y-%m-%d %H:%M:%S")
print(t8) # time.struct_time(tm_year=1997, tm_mon=7, tm_mday=1, tm_hour=10, tm_min=12, tm_sec=20, tm_wday=1, tm_yday=182, tm_isdst=-1)

#clock() 返回当前的程序执行时间,unix系统始终返回全部运行的时间,而windows从第二次开始都是以第一次调用次函数的时间戳为准。

2、datetime模块

"""
datetime比time模块高级不少,可以理解为datetime基于time进行封装,提供了更实用的函数接口,
datetime模块的接口更直观,更容易调用
"""
import datetime
'''
datetime模块中的类:
(1)time:关注时间
(2)date:关注日期
(3)datetime:同时有时间和日期
(4)timedelta:主要用于计算时间跨度
(5)tzinfo:时区相关
(6)timezone:
'''
# 获取当前时间
t1= datetime.datetime.now()
print(t1,type(t1)) # 2019-07-11 10:11:01.157269 <class 'datetime.datetime'>

# 获取指定时间
t2=datetime.datetime(2019,7,11,10,11,0,0)
print(t2) # 2019-07-11 10:11:00

# 将时间转换为字符串,这个常用
t3= t1.strftime("%Y-%m-%d %X")
print(t3,type(t3)) # 2019-07-11 10:51:20 <class 'str'>

#将格式化字符串转换为datetime对象
t4 = datetime.datetime.strptime(t3,'%Y-%m-%d %X')
print(t4,type(t4)) # 2019-07-11 10:52:28 <class 'datetime.datetime'>

# 时间是可以相减的
t5 = datetime.datetime(2019,7,10,23,12,5,0)
t6 =datetime.datetime(2019,7,11,10,54,0,0)
t7 = t6-t5
print(t7,type(t7)) # 11:41:55 <class 'datetime.timedelta'>
print(t7.days) # 间隔天数
print(t7.seconds) # 除去间隔天数以外的间隔秒数
print(t7.microseconds)

【datetime例子】

import datetime
if __name__ == '__main__':
    #1、today()和now()获取当前日期和时间,时间精度到毫秒
    print(datetime.datetime.today()) #datetime.datetime类型 2020-02-22 11:09:26.349982
    print(datetime.datetime.now()) # 2020-02-22 11:11:13.960383
    #2、使用strftime()格式化时间为标准格式,年份Y大写。
    print(datetime.datetime.now().strftime("%Y-%m-%d")) # 2020-02-22
    print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) #2020-02-22 11:13:48
    # 3、倒计时使用strptime对象
    day20 = datetime.datetime.strptime('2020-03-03 0:0:0','%Y-%m-%d %H:%M:%S')
    now = datetime.datetime.today()
    delta = day20 - now # delta存储两个时间的时间,差精度到毫秒
    day = delta.days # 获取两个时间之间的天数
    hour = int(delta.seconds/60/60) #使用int把小时取整
    minute = int((delta.seconds - hour *60*60)/60) # 分钟取整
    seconds = delta.seconds - hour*60*60 -minute*60 # 秒取整
    print("距离2020-03-03还有{}天{}小时{}分钟{}秒".format(str(day),str(hour),str(minute),str(seconds)))

    #4、计算未来或过去 需要timedelta对象
    print("5天后是几号:",datetime.datetime.now() + datetime.timedelta(days=5))
    print("10天前是几号:",datetime.datetime.now() - datetime.timedelta(days=10))
    print("20个小时候:",datetime.datetime.now() + datetime.timedelta(hours=20))
    print("500分钟后:",datetime.datetime.now() + datetime.timedelta(minutes=500))
    m_time = datetime.datetime.now() + datetime.timedelta(minutes=500)
    print(m_time.strptime('%Y-%m-%d'))

3、calendar模块

# 日历模块
import calendar
#返回指定年的某月
print(calendar.month(2019,7)) #

# 返回指定年的日历
print(calendar.calendar(2019))

# 判断某一年是否是闰年
print(calendar.isleap(2019)) # False

# 返回某个月的weekday的第一天和这个月的所有天数
print(calendar.monthrange(2019,6))# 返回元组,第一个值表示这个月的第一个是weekday


#返回某个月以一周为周期的元组序列
print(calendar.monthcalendar(2018,12)) # [[0, 0, 0, 0, 0, 1, 2], [3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16], [17, 18, 19, 20, 21, 22, 23], [24, 25, 26, 27, 28, 29, 30], [31, 0, 0, 0, 0, 0, 0]]

4、arrow日期模块

pip install arrow
【1获取当前时间arrow.utcnow()和  arrow.now()】

import arrow
# <class 'arrow.arrow.Arrow'> 2019-10-18T03:02:00.390265+00:00
print(type(arrow.utcnow()),arrow.utcnow())
# arrow.now()类型为arrow.arrow.Arrow;结果为 2019-10-18T10:42:14.842503+08:00
print(type(arrow.now()),arrow.now()) #

【2将时间戳转化为arrow对象】
将时间戳转化为arrow对象需要使用get()方法;arrow.get(timestamp) 。
>>> arrow.get(1519534533) 
<Arrow [2018-02-25T04:55:33+00:00]> 
>>> arrow.get('1519534533') 
<Arrow [2018-02-25T04:55:33+00:00]>  
>>> arrow.get(1519534533.153443)
<Arrow [2018-02-25T04:55:33.153443+00:00]>  
>>> arrow.get('1519534533.153443')

【将字符串转换为arrow对象】
将字符串转换为arrow对象;arrow.get(string[,format_string])

import arrow
d0 = arrow.get('2018-02-24 12:30:45', 'YYYY-MM-DD HH:mm:ss')
print(d0) # 2018-02-24T12:30:45+00:00

【arrow对象属性】

import arrow
obj_arrow = arrow.utcnow()
# <class 'datetime.datetime'> 2019-10-18 03:06:36.020147+00:00
print(type(obj_arrow.datetime),obj_arrow.datetime)
# <class 'int'> 1571368039
print(type(obj_arrow.timestamp),obj_arrow.timestamp)

# <class 'datetime.datetime'> 2019-10-18 03:08:00.016222
print(type(obj_arrow.naive),obj_arrow.naive)

【 获取datetime对象的值】

import arrow
obj_arrow = arrow.utcnow()
print("当前时间年份",obj_arrow.year)
print("当前时间的月份",obj_arrow.month)
print("当前时间本月那天",obj_arrow.day)
print("当前时间小时",obj_arrow.hour)
print("当前时间的分钟",obj_arrow.minute)
print("当前时间的秒数",obj_arrow.second)
print("当前时间的毫秒",obj_arrow.microsecond)

【时间推移】

#时间推移 shift(**kwargs)
import arrow
obj_arrow = arrow.utcnow()
# 2019-11-08T03:11:57.966314+00:00 <class 'arrow.arrow.Arrow'>
print("三周后",obj_arrow.shift(weeks=+3),type(obj_arrow.shift(weeks=+3)))
print("一天前",obj_arrow.shift(days=-1))
print("当前时间本月那天",obj_arrow.day)
print("当前时间小时",obj_arrow.hour)
print("当前时间的分钟",obj_arrow.minute)
print("当前时间的秒数",obj_arrow.second)
print("当前时间的毫秒",obj_arrow.microsecond)

【时间替换replace(**kwargs)】

import arrow
obj_arrow = arrow.utcnow()
print("替换年份",obj_arrow.replace(year=2020))
print("替换月份",obj_arrow.replace(month=12))
print("替换天",obj_arrow.replace(day=12))
print("替换小时",obj_arrow.replace(hour=12))
print("替换分钟",obj_arrow.replace(minute=59))
print("替换秒",obj_arrow.replace(second=1))

【格式化输出 format([format_string])】

import arrow
obj_arrow = arrow.utcnow()
print(obj_arrow.format("YYYY-MM-DD HH:mm:ss ZZ"))
print(obj_arrow.format("YYYY-MM-DD"))

【人性化输出humanize()】

import arrow
obj_arrow = arrow.utcnow()
past = obj_arrow.shift(hours=-1)
#locale参数可以指定地区语言
print(past.humanize(obj_arrow, locale='zh')) # 1小时前

【获取某一年中的所有日期】

import arrow
def isLeapYear(years):
    '''
    通过判断闰年,获取年份years下一年的总天数
    :param years: 年份,int
    :return:days_sum,一年的总天数
    '''
    # 断言:年份不为整数时,抛出异常。
    assert isinstance(years, int), "请输入整数年,如 2018"

    if ((years % 4 == 0 and years % 100 != 0) or (years % 400 == 0)):  # 判断是否是闰年
        # print(years, "是闰年")
        days_sum = 366
        return days_sum
    else:
        # print(years, '不是闰年')
        days_sum = 365
        return days_sum


def getAllDayPerYear(years):
    '''
    获取一年的所有日期
    :param years:年份
    :return:全部日期列表
    '''
    start_date = '%s-1-1' % years
    a = 0
    all_date_list = []
    days_sum = isLeapYear(int(years))
    print()
    while a < days_sum:
        b = arrow.get(start_date).shift(days=a).format("YYYY-MM-DD")
        a += 1
        all_date_list.append(b)
    # print(all_date_list)
    return all_date_list


if __name__ == '__main__':
    # years = "2001"
    # years = int(years)
    # # 通过判断闰年,获取一年的总天数
    # days_sum = isLeapYear(years)

    # 获取一年的所有日期
    all_date_list = getAllDayPerYear("2000")
    print(all_date_list)

【获取一个月的最后一天】

    def last_day_of_month(self,any_day):
        """
        获取获得一个月中的最后一天
        :param any_day: 任意日期 格式为:2020-2-24
        :return: string
        """
        any_day = datetime.datetime.strptime(any_day,'%Y-%m-%d')
        next_month = any_day.replace(day=28) + datetime.timedelta(days=4)  # this will never fail
        #any_last_day datetime.datetime对象
        any_last_day = next_month - datetime.timedelta(days=next_month.day)
        return datetime.datetime.strftime(any_last_day,'%Y-%m-%d')

【把输入一个日期范围,得到每一天的日期】

# -*- coding: utf-8 -*-
# Version:python3.7
import datetime,time
def getBetweenDay(begin_date,end_date):
    """输入一个日期范围,得到每一天"""
    date_list = []
    begin_date = datetime.datetime.strptime(begin_date, "%Y-%m-%d")
    end_date = datetime.datetime.strptime(end_date, "%Y-%m-%d")
    while begin_date <= end_date:
        date_str = begin_date.strftime("%Y-%m-%d")
        date_list.append(date_str)
        begin_date += datetime.timedelta(days=1)
    return date_list

date_list = getBetweenDay('2020-01-20','2020-02-20')
print(date_list)

【把日期范围按照月为单位切分】

# -*- coding: utf-8 -*-
# Version:python3.7
import datetime,calendar,time,re
def get_date_range_list(input_start_date, end_date):
    """
    获取时间参数列表
    :param start_date: 起始月初时间 --> str
    :param end_date: 结束时间 --> str
    :return: date_range_list -->list
    """
    date_range_list = []
    start_date = re.sub(r"-(\d{1,2})$", "-01", input_start_date)
    startdate = datetime.datetime.strptime(start_date, '%Y-%m-%d')
    # startdate = datetime.date(start_date.year, start_date.month, 1)
    enddate = datetime.datetime.strptime(end_date, '%Y-%m-%d')
    input_lastmonth_firstday = datetime.date(enddate.year, enddate.month, day=1)  # 获取输入截止日期月份第一天
    input_last_year = enddate.year
    input_last_month = enddate.month

    while True:
        # =calendar.monthrange(startdate.year, startdate.month)[1]得到某一年某一月一共多少天
        next_month = startdate + datetime.timedelta(days=calendar.monthrange(startdate.year, startdate.month)[1])
        month_end = next_month - datetime.timedelta(days=1)
        # print(type(next_month),type(month_end))
        if month_end < enddate:
            date_range_list.append((datetime.datetime.strftime(startdate,
                                                               '%Y-%m-%d'),
                                    datetime.datetime.strftime(month_end,
                                                               '%Y-%m-%d')))
            startdate = next_month
        else:
            # 修改开始一段时间
            first_lasy_day = date_range_list[0][1]
            del (date_range_list[0])
            date_range_list.insert(0, (input_start_date, first_lasy_day))
            # 添加最一段时间
            date_range_list.append(
                (datetime.datetime.strftime(datetime.date(input_last_year, input_last_month, day=1),
                                            '%Y-%m-%d'), end_date))
            return date_range_list
if __name__ == '__main__':
    range_day = get_date_range_list("2019-08-20","2020-03-03")
    print(range_day)

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值