Python之日期与时间处理模块(date和datetime)
|
前言 在开发工作中,我们经常需要用到日期与时间,如:
Python中提供了多个用于对日期和时间进行操作的内置模块:time模块、datetime模块和calendar模块。其中time模块是通过调用C库实现的,所以有些方法在某些平台上可能无法调用,但是其提供的大部分接口与C标准库time.h基本一致。time模块相比,datetime模块提供的接口更直观、易用,功能也更加强大。 一、相关术语的解释
二、时间的表现形式 常见的时间表示形式为:
Python中还有其它的时间表示形式:
关于datetime模块的datetime类会在下面做详细讲解,这里简单说下time.struct_time。 time.struct_time包含如下属性:
属性值的获取方式有两种:
需要说明的是struct_time实例的各个属性都是只读的,不可修改。 三、 time模块 time模块主要用于时间访问和转换,这个模块提供了各种与时间相关的函数。 1. 函数列表
2. 练习 获取时间戳格式的时间 >>> 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_hour=6,tm_sec=56,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_min=7,tm_isdst=0) >>> t3 = time.gmtime(t1) >>> print(t3) time.struct_time(tm_year=2017,tm_isdst=0) >>> 字符串格式转struct_time格式时间
>>> time.strptime('Sat Feb 04 14:06:42 2017')
time.struct_time(tm_year=2017,tm_min=6,tm_sec=42,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_isdst=-1)
>>> time.strptime('2017-02-04 14:12','%Y-%m-%d %H:%M')
time.struct_time(tm_year=2017,tm_min=12,tm_sec=0,tm_isdst=-1)
>>> time.strptime('2017/02/04 14:12','%Y/%m/%d %H:%M')
time.struct_time(tm_year=2017,tm_isdst=-1)
>>> time.strptime('201702041412','%Y%m%d%H%M')
time.struct_time(tm_year=2017,tm_isdst=-1)
struct_time格式转字符串格式时间
>>> time.strftime('%Y-%m-%d %H:%M',time.localtime())
'2017-02-04 14:19'
struct_time格式转时间戳格式时间
>>> time.mktime(time.localtime())
1486189282.0
3. 时间格式转换 时间戳格式的时间 与 字符串格式的时间 虽然可以通过ctime([secs])方法进行转换,但是字符串格式不太适应中国国情。因此,整体而言,它们 不能直接进行转换,需要通过struct_time作为中介,转换关系如下:
说明:上面的 '%H:%M:%S' 可以直接用 '%X' 代替。 四、 datetime模块 datetime模块提供了处理日期和时间的类,既有简单的方式,又有复杂的方式。它虽然支持日期和时间算法,但其实现的重点是为输出格式化和操作提供高效的属性提取功能。 1. datetime模块中定义的类 datetime模块定义了以下几个类:
需要说明的是:这些类的对象都是不可变的。 类之间的关系: object date datetime time timedelta tzinfo timezone 2. datetime模块中定义的常量
3. datetime.date类 datetime.date类的定义 class datetime.date(year,month,day) year,month 和 day都是是必须参数,各参数的取值范围为:
类方法和属性
对象方法和属性
实例
>>> 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,4)
>>>
>>> d = date.today()
>>> d.year
2017
>>> d.month
2
>>> d.day
4
>>> d.replace(2016)
datetime.date(2016,4)
>>> d.replace(2016,3)
>>> d.replace(2016,3,2)
datetime.date(2016,2)
>>> d.timetuple()
time.struct_time(tm_year=2017,tm_hour=0,tm_min=0,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[,[microsecond[,tzinfo]]]]) hour为必须参数,其他为可选参数。各参数的取值范围为:
类方法和属性
对象方法和属性
实例
>>> from datetime import time
>>>
>>> time.max
datetime.time(23,999999)
>>> time.min
datetime.time(0,0)
>>> time.resolution
datetime.timedelta(0,1)
>>>
>>> t = time(20,40,8888)
>>> t.hour
20
>>> t.minute
5
>>> t.second
40
>>> t.microsecond
8888
>>> t.tzinfo
>>>
>>> t.replace(21)
datetime.time(21,8888)
>>> t.isoformat()
'20:05:40.008888'
>>> t.strftime('%H%M%S')
'200540'
>>> t.strftime('%H%M%S.%f')
'200540.008888'
5. datetime.datetime类 datetime类的定义 复制代码 代码如下: class datetime.datetime(year,day,hour=0,minute=0,second=0,microsecond=0,tzinfo=None) year,month 和 day是必须要传递的参数, tzinfo可以是None或tzinfo子类的实例。 各参数的取值范围为:
如果一个参数超出了这些范围,会引起ValueError异常。 类方法和属性
对象方法和属性
实例
>>> from datetime import datetime,timezone
>>>
>>> datetime.today()
datetime.datetime(2017,4,20,44,556318)
>>> datetime.now()
datetime.datetime(2017,56,572615)
>>> datetime.now(timezone.utc)
datetime.datetime(2017,45,22,881694,tzinfo=datetime.timezone.utc)
>>> datetime.utcnow()
datetime.datetime(2017,52,812508)
>>> import time
>>> datetime.fromtimestamp(time.time())
datetime.datetime(2017,46,41,97578)
>>> datetime.utcfromtimestamp(time.time())
datetime.datetime(2017,989413)
>>> datetime.combine(date(2017,4),t)
datetime.datetime(2017,8888)
>>> datetime.strptime('2017/02/04 20:49','%Y/%m/%d %H:%M')
datetime.datetime(2017,49)
>>> dt = datetime.now()
>>> dt
datetime.datetime(2017,57,621378)
>>> dt.year
2017
>>> dt.month
2
>>> dt.day
4
>>> dt.hour
20
>>> dt.minute
57
>>> dt.second
0
>>> dt.microsecond
621378
>>> dt.tzinfo
>>> dt.timestamp()
1486213020.621378
>>> dt.date()
datetime.date(2017,4)
>>> dt.time()
datetime.time(20,621378)
>>> dt.timetz()
datetime.time(20,621378)
>>> dt.replace()
datetime.datetime(2017,621378)
>>> dt.replace(2016)
datetime.datetime(2016,621378)
>>> dt.timetuple()
time.struct_time(tm_year=2017,tm_hour=20,tm_min=57,tm_isdst=-1)
>>> dt.utctimetuple()
time.struct_time(tm_year=2017,tm_isdst=0)
>>> dt.toordinal()
736364
>>> dt.weekday()
5
>>> dt.isocalendar()
(2017,6)
>>> dt.isoformat()
'2017-02-04T20:57:00.621378'
>>> dt.isoformat(sep='/')
'2017-02-04/20:57:00.621378'
>>> dt.isoformat(sep=' ')
'2017-02-04 20:57:00.621378'
>>> dt.ctime()
'Sat Feb 4 20:57:00 2017'
>>> dt.strftime('%Y%m%d %H:%M:%S.%f')
'20170204 20:57:00.621378'
6. 使用datetime.datetime类对时间戳与时间字符串进行转换
7. datetime.timedelta类 timedelta对象表示连个不同时间之间的差值。如果使用time模块对时间进行算术运行,只能将字符串格式的时间 和 struct_time格式的时间对象 先转换为时间戳格式,然后对该时间戳加上或减去n秒,最后再转换回struct_time格式或字符串格式,这显然很不方便。而datetime模块提供的timedelta类可以让我们很方面的对datetime.date,datetime.time和datetime.datetime对象做算术运算,且两个时间之间的差值单位也更加容易控制。 datetime.timedelta类的定义 复制代码 代码如下: class datetime.timedelta(days=0,seconds=0,microseconds=0,milliseconds=0,hours=0,weeks=0) 所有参数都是默认参数,因此都是可选参数。参数的值可以是整数或浮点数,也可以是正数或负数。内部值存储days、seconds 和 microseconds,其他所有参数都将被转换成这3个单位:
然后对这3个值进行标准化,使得它们的表示是唯一的:
类属性
实例方法和属性
实例 >>> import datetime >>> >>> datetime.timedelta(365).total_seconds() # 一年包含的总秒数 31536000.0 >>> dt = datetime.datetime.now() >>> dt + datetime.timedelta(3) # 3天后 datetime.datetime(2017,8,9,39,102821) >>> dt + datetime.timedelta(-3) # 3天前 datetime.datetime(2017,102821) >>> dt + datetime.timedelta(hours=3) # 3小时后 datetime.datetime(2017,102821) >>> dt + datetime.timedelta(hours=-3) # 3小时前 datetime.datetime(2017,6,102821) >>> dt + datetime.timedelta(hours=3,seconds=30) # 3小时30秒后 datetime.datetime(2017,10,102821) 五、时间格式码 time模块的struct_time以及datetime模块的datetime、date、time类都提供了strftime()方法,该方法可 以输出一个指定格式的时间字符串。具体格式由一系列的格式码(格式字符)组成,Python最终调用的是各个平台C库的strftme()函数,因此各平台对全套格式码的支持会有所不同,具体情况需要参考该平台上的strftime(3)文档。下面列出了C标准(1989版)要求的所有格式码,它们在所有标准C实现的平台上都可以工作:
六、总结 那么Python中处理时间时,使用time模块好,还是用datetime模块好呢?就我个人而言,datetime模块基本上可以满足需要,且用起来确实比较方便。对于time模块,我只是在取当前时间的时间戳时会用到time.time()方法,当然也可以通过datetime.datetime.now().timestamp()来获取,只是显得复杂一点。我觉得还是看个人习惯吧,没有什么绝对的好坏之分。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 您可能感兴趣的文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |



