美文网首页
python基础篇07-日期模块

python基础篇07-日期模块

作者: 只知坚持_d778 | 来源:发表于2018-05-21 16:49 被阅读0次

    python内置了多个用于日期和时间进行操作的内置模块:time模块,datetime模块和calendar模块。

    • UTC time Coordinated Universal Time,世界协调时,又称 格林尼治天文时间、世界标准时间。与UTC time对应的是各个时区的local time,东N区的时间比UTC时间早N个小时,因此UTC time + N小时 即为东N区的本地时间;而西N区时间比UTC时间晚N个小时,即 UTC time - N小时 即为西N区的本地时间; 中国在东8区,因此比UTC时间早8小时,可以以UTC+8进行表示。
    • epoch time 表示时间开始的起点;它是一个特定的时间,不同平台上这个时间点的值不太相同,对于Unix而言,epoch time为 1970-01-01 00:00:00 UTC。
    • timestamp(时间戳) 也称为Unix时间 或 POSIX时间;它是一种时间表示方式,表示从格林尼治时间1970年1月1日0时0分0秒开始到现在所经过的毫秒数,其值为float类型。 但是有些编程语言的相关方法返回的是秒数(Python就是这样),这个需要看方法的文档说明。需要说明的是时间戳是个差值,其值与时区无关。

    常见的时间表示形式为:

    • 时间戳
    • 格式化的时间字符串

    Python中还有其它的时间表示形式:

    • time模块的time.struct_time
    • datetime模块的datetime类

    time.struct_time

    关于datetime模块的datetime类会在下面做详细讲解,这里简单说下time.struct_time。

    time.struct_time包含如下属性:

    下标/索引 属性名称 描述
    0 tm_year 年份,如 2017
    1 tm_mon 月份,取值范围为[1, 12]
    2 tm_mday 一个月中的第几天,取值范围为[1-31]
    3 tm_hour 小时, 取值范围为[0-23]
    4 tm_min 分钟,取值范围为[0, 59]
    5 tm_sec 秒,取值范围为[0, 61]
    6 tm_wday 一个星期中的第几天,取值范围为[0-6],0表示星期一
    7 tm_yday 一年中的第几天,取值范围为[1, 366]
    8 tm_isdst 是否为夏令时,可取值为:0 , 1 或 -1

    获取方式可以通过下表或者索引,另一种是通过属性名称,例如:time.struct_time.tm_year.

    常用time模块

    方法/属性 描述
    time.ctime([secs]) 功能同上,将一个秒数时间戳表示的时间转换为一个表示当前本地时间的字符串。如果参数secs没有提供或值为None,则取time()方法的返回值作为默认值。ctime(secs)等价于asctime(localtime(secs))
    time.time() 返回时间戳(自1970-1-1 0:00:00 至今所经历的秒数)
    time.mktime(struct_time_instance) 将struct_time对象实例转换成时间戳
    time.localtime([secs]) 返回以指定时间戳对应的本地时间的 struct_time对象(可以通过下标,也可以通过 .属性名 的方式来引用内部属性)格式
    time.localtime(time.time() + n*3600)返回n个小时后本地时间的 struct_time 对象格式(可以用来实现类似crontab的功能)
    time.gmtime([secs]) 返回指定时间戳对应的utc时间的 struct_time对象格式(与当前本地时间差8个小时)
    time.strptime(time_str, time_format_str) 将时间字符串转换为struct_time时间对象,如:time.strptime('2017-01-13 17:07', '%Y-%m-%d %H:%M')
    time.strftime(time_format_str, struct_time_instance) 将struct_time对象实例转换成字符串

    练习

    获取时间戳格式的时间

      >>> time.time()
      1486188022.862
    

    获取struct_time格式的时间

    >>> time.localtime()
    time.struct_time(tm_year=2017, tm_mon=2, tm_mday=4, tm_hour=14,tm_min=2, tm_sec=34, tm_wday=5, tm_yday=35, tm_isdst=0)
    >>> time.gmtime()
    time.struct_time(tm_year=2017, tm_mon=2, tm_mday=4, tm_hour=6, tm_min=2, tm_sec=56, tm_wday=5, tm_yday=35, tm_isdst=0)
    

    获取字符串格式的时间

    >>> time.ctime()
    'Sat Feb 04 14:06:42 2017'
    >>> time.asctime()
    'Sat Feb 04 14:06:47 2017'
    

    时间戳格式转struct_time格式时间

    >>> t1 = time.time()
    >>> print(t1)
    1486188476.9
    >>> t2 = time.localtime(t1)
    >>> print(t2)
    time.struct_time(tm_year=2017, tm_mon=2, tm_mday=4, tm_hour=14,  tm_min=7, tm_sec=56, tm_wday=5, tm_yday=35, tm_isdst=0)
    >>> t3 = time.gmtime(t1)
    >>> print(t3)
    time.struct_time(tm_year=2017, tm_mon=2, tm_mday=4, tm_hour=6,   tm_min=7, tm_sec=56, tm_wday=5, tm_yday=35, tm_isdst=0)
    

    字符串格式转struct_time格式时间

    >>> time.strptime('Sat Feb 04 14:06:42 2017')
    time.struct_time(tm_year=2017, tm_mon=2, tm_mday=4, tm_hour=14, tm_min=6, tm_sec=42, tm_wday=5, tm_yday=35, tm_isdst=-1)
    >>> time.strptime('Sat Feb 04 14:06:42 2017', '%a %b %d %H:%M:%S %Y')
    time.struct_time(tm_year=2017, tm_mon=2, tm_mday=4, tm_hour=14, tm_min=6, tm_sec=42, tm_wday=5, tm_yday=35, tm_isdst=-1)
    >>> time.strptime('2017-02-04 14:12', '%Y-%m-%d %H:%M')
    time.struct_time(tm_year=2017, tm_mon=2, tm_mday=4, tm_hour=14, tm_min=12, tm_sec=0, tm_wday=5, tm_yday=35, tm_isdst=-1)
    >>> time.strptime('2017/02/04 14:12', '%Y/%m/%d %H:%M')
    time.struct_time(tm_year=2017, tm_mon=2, tm_mday=4, tm_hour=14, tm_min=12, tm_sec=0, tm_wday=5, tm_yday=35, tm_isdst=-1)
    >>> time.strptime('201702041412', '%Y%m%d%H%M')
    time.struct_time(tm_year=2017, tm_mon=2, tm_mday=4, tm_hour=14, tm_min=12, tm_sec=0, tm_wday=5, tm_yday=35, tm_isdst=-1)
    

    struct_time格式转字符串格式时间
    >>> time.strftime('%Y-%m-%d %H:%M', time.localtime())
    '2017-02-04 14:19'

    时间格式转换

    时间戳格式的时间 与 字符串格式的时间 虽然可以通过ctime([secs])方法进行转换,但是字符串格式不太适应中国国情。因此,整体而言,它们 不能直接进行转换,需要通过struct_time作为中介,转换关系如下:


    时间格式转换

    说明:上面的 '%H:%M:%S' 可以直接用 '%X' 代替。

    datetime模块

    1. datetime模块中定义的类

    datetime模块定义了以下几个类:

    类名称 描述
    datetime.date 表示日期,常用的属性有:year, month和day
    datetime.time 表示时间,常用属性有:hour, minute, second, microsecond
    datetime.datetime 表示日期时间
    datetime.timedelta 表示两个date、time、datetime实例之间的时间间隔,分辨率(最小单位)可达到微秒
    datetime.tzinfo 时区相关信息对象的抽象基类。它们由datetime和time类使用,以提供自定义时间的而调整。
    datetime.timezone Python 3.2中新增的功能,实现tzinfo抽象基类的类,表示与UTC的固定偏移量

    需要说明的是:这些类的对象都是不可变的。

    2. datetime.date类

    class datetime.date(year, month, day)

    year, month 和 day都是是必须参数,各参数的取值范围为:

    参数名称 取值范围
    year [MINYEAR, MAXYEAR]
    month [1, 12]
    day [1, 指定年份的月份中的天数]

    类方法和属性

    类方法/属性名称 描述
    date.max date对象所能表示的最大日期:9999-12-31
    date.min date 对象所能表示的最小日志:00001-01-01
    date.resoluation date对象表示的日期的最小单位:天
    date.today() 返回一个表示当前本地日期的date对象
    date.fromtimestamp(timestamp) 根据跟定的时间戳,返回一个date对象

    对象方法和属性

    对象方法/属性名称 描述
    d.year
    d.month
    d.day
    d.replace(year[, month[, day]]) 生成并返回一个新的日期对象,原日期对象不变
    d.timetuple() 返回日期对应的time.struct_time对象
    d.toordinal() 返回日期是是自 0001-01-01 开始的第多少天
    d.weekday() 返回日期是星期几,[0, 6],0表示星期一
    d.isoweekday() 返回日期是星期几,[1, 7], 1表示星期一
    d.isocalendar() 返回一个元组,格式为:(year, weekday, isoweekday)
    d.isoformat() 返回‘YYYY-MM-DD’格式的日期字符串
    d.strftime(format) 返回指定格式的日期字符串,与time模块的strftime(format, struct_time)功能相同

    实例

    >>> import time
    >>> from datetime import date
    >>>
    >>> date.max
    datetime.date(9999, 12, 31)
    >>> date.min
    datetime.date(1, 1, 1)
    >>> date.resolution
    datetime.timedelta(1)
    >>> date.today()
    datetime.date(2017, 2, 4)
    >>> date.fromtimestamp(time.time())
    datetime.date(2017, 2, 4)
    >>>
    >>> d = date.today()
    >>> d.year
    2017
    >>> d.month
    2
    >>> d.day
    4
    >>> d.replace(2016)
    datetime.date(2016, 2, 4)
    >>> d.replace(2016, 3)
    >>> d.replace(2016, 3, 2)
    datetime.date(2016, 3, 2)
    >>> d.timetuple()
    time.struct_time(tm_year=2017, tm_mon=2, tm_mday=4, tm_hour=0,   tm_min=0, tm_sec=0, tm_wday=5, tm_yday=35, tm_isdst=-1)
    >>> d.toordinal()
    736364
    >>> d.weekday()
    5
    >>> d.isoweekday()
    6
    >>> d.isocalendar()
    (2017, 5, 6)
    >>> d.isoformat()
    '2017-02-04'
    >>> d.ctime()
    'Sat Feb  4 00:00:00 2017'
    >>> d.strftime('%Y/%m/%d')
    '2017/02/04'
    

    4. datetime.time类

    time类的定义
    class datetime.time(hour, [minute[, second, [microsecond[, tzinfo]]]])
    hour为必须参数,其他为可选参数。各参数的取值范围为:

    参数名称 取值范围
    hour [0, 23]
    minute [0, 59]
    second [0, 59]
    microsecond [0, 1000000]
    tzinfo tzinfo的子类对象,如timezone类的实例

    类方法和属性

    类方法/属性名称 描述
    time.max time类所能表示的最大时间:time(23, 59, 59, 999999)
    time.min time类所能表示的最小时间:time(0, 0, 0, 0)
    time.resolution 时间的最小单位,即两个不同时间的最小差值:1微秒

    对象方法和属性

    对象方法/属性名称 描述
    t.hour
    t.minute
    t.second
    t.microsecond 微秒
    t.tzinfo 返回传递给time构造方法的tzinfo对象,如果该参数未给出,则返回None
    t.replace(hour[, minute[, second[, microsecond[, tzinfo]]]]) 生成并返回一个新的时间对象,原时间对象不变
    t.isoformat() 返回一个‘HH:MM:SS.%f’格式的时间字符串
    t.strftime() 返回指定格式的时间字符串,与time模块的strftime(format, struct_time)功能相同

    练习

    >>> from datetime import time
    >>>
    >>> time.max
    datetime.time(23, 59, 59, 999999)
    >>> time.min
    datetime.time(0, 0)
    >>> time.resolution
    datetime.timedelta(0, 0, 1)
    >>>
    >>> t = time(20, 5, 40, 8888)
    >>> t.hour
    20
    >>> t.minute
    5
    >>> t.second
    40
    >>> t.microsecond
    8888
    >>> t.tzinfo
    >>>
    >>> t.replace(21)
    datetime.time(21, 5, 40, 8888)
    >>> t.isoformat()
    '20:05:40.008888'
    >>> t.strftime('%H%M%S')
    '200540'
    >>> t.strftime('%H%M%S.%f')
    '200540.008888'
    

    4. datetime的datetime类

    datetime类有很多参数,datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]]),返回年月日,时分秒
    
    datetime.datetime.ctime()
    
    datetime.datetime.now().date():返回当前日期时间的日期部分
    
    datetime.datetime.now().time():返回当前日期时间的时间部分
    
    datetime.datetime.fromtimestamp()
    
    datetime.datetime.now():返回当前系统时间
    
    datetime.datetime.replace()
    
    >>> datetime.datetime.now().strftime('%Y-%m-%d,%H:%M:%S')
    '2019-03-22,13:35:24'
    
    datetime.datetime.strftime():由日期格式转化为字符串格式
    
      datetime.datetime.now().strftime('%b-%d-%Y %H:%M:%S')
      'Apr-16-2017 21:01:35'
    
    datetime.datetime.strptime():由字符串格式转化为日期格式
    
    datetime.datetime.strptime('Apr-16-2017 21:01:35', '%b-%d-%Y %H:%M:%S')
    2017-04-16 21:01:35
    

    5. datetime的timedelta类

    datetime.datetime.timedelta用于计算两个日期之间的差值,例如:
    
    >>> a=datetime.datetime.now()
    >>> b=datetime.datetime.now()
    >>> a
    datetime.datetime(2017, 4, 16, 21, 21, 20, 871000)
    >>> b
    datetime.datetime(2017, 4, 16, 21, 21, 29, 603000)
    
    >>> b-a
    datetime.timedelta(0, 8, 732000)
    >>> (b-a).seconds
    8
    
    或者
    
    time1 = datetime.datetime(2016, 10, 20)
    time2 = datetime.datetime(2015, 11, 2)
    
    """计算天数差值"""
    print(time1-time2).days
    
    """计算两个日期之间相隔的秒数"""
    print (time1-time2).total_seconds()
    

    相关文章

      网友评论

          本文标题:python基础篇07-日期模块

          本文链接:https://www.haomeiwen.com/subject/ueifjftx.html