17-[模块]-time&datetime
1.表示时间time方式
在Python中,用三种方式来表示时间,分别是时间戳、格式化时间字符串和结构化时间
1.时间戳(timestamp):也就是1970年1月1日之后的秒, 例如1506388236.216345,可以通过time.time()获得。时间戳是一个浮点数,可以进行加减运算,但请注意不要让结果超出取值范围。 2.格式化的时间字符串(string_time):也就是年月日时分秒这样的我们常见的时间字符串, 例如2017-09-26 09:12:48,可以通过time.localtime()获得; 3,结构化时间(struct_time):一个包含了年月日时分秒的多元元组, 例如time.struct_time(tm_year=2017, tm_mon=9, tm_mday=26, tm_hour=9, tm_min=14, tm_sec=50, tm_wday=1, tm_yday=269, tm_isdst=0),可以通过time.strftime('%Y-%m-%d')获得。
由于Python的time模块实现主要调用C库,所以各个平台可能有所不同。time模块目前只支持到2038年前。如果需要处理范围之外的日期,请使用datetime模块。
UTC(Coordinated Universal Time,世界协调时),亦即格林威治天文时间,世界标准时间。我们中国为东八区,比UTC早8个小时,也就是UTC+8。关于UTC的缩写,有个故事,你可能已经注意到了,按英文的缩写,应该是CUT,而不是UTC。但是世界协调时在法文中的缩写是TUC,两国互相不让,作为妥协,最后干脆简称UTC。
DST(Daylight Saving Time)即夏令时。
2.time模块的方法
- time.localtime([secs]):将一个时间戳转换为当前时区的struct_time。secs参数未提供,则以当前时间为准。
- time.gmtime([secs]):和localtime()方法类似,gmtime()方法是将一个时间戳转换为UTC时区(0时区)的struct_time。
- time.time():返回当前时间的时间戳。
- time.mktime(t):将一个struct_time转化为时间戳。
- time.sleep(secs):线程推迟指定的时间运行。单位为秒。
- time.asctime([t]):把一个表示时间的元组或者struct_time表示为这种形式:'Sun Oct 1 12:04:38 2017'。如果没有参数,将会将time.localtime()作为参数传入。
- time.ctime([secs]):把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。如果参数未给或者为None的时候,将会默认time.time()为参数。它的作用相当于time.asctime(time.localtime(secs))。
-
time.strftime(format[, t]):把一个代表时间的元组或者struct_time(如由time.localtime()和time.gmtime()返回)转化为格式化的时间字符串。如果t未指定,将传入time.localtime()。
- 举例:time.strftime("%Y-%m-%d %X", time.localtime()) #输出'2017-10-01 12:14:23'
-
time.strptime(string[, format]):把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作。
- 举例:time.strptime('2017-10-3 17:54',"%Y-%m-%d %H:%M") #输出 time.struct_time(tm_year=2017, tm_mon=10, tm_mday=3, tm_hour=17, tm_min=54, tm_sec=0, tm_wday=1, tm_yday=276, tm_isdst=-1)
# time.time() 方法 :当前时间戳 In [22]: import time In [23]: time.time() Out[23]: 1518865113.717425 In [24]: time.time()/3600/24/365 Out[24]: 48.1628973505411 In [25]: time.time()/3600/24/365 + 1970 Out[25]: 2018.1628977987789
3.结构化时间
结构化时间元组共有9个元素,按顺序排列如下表: 索引 属性 取值范围 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(weekday) 0 - 6(0表示周一) 7 tm_yday(一年中的第几天) 1 - 366 8 tm_isdst(是否是夏令时) 默认为-1 既然结构化时间是一个元组,那么就可以通过索引进行取值,也可以进行分片,或者通过属性名获取对应的值。
# time.localtime() 该时区 当前时间的 时间戳转换为结构化时间 In [26]: time.localtime() Out[26]: time.struct_time(tm_year=2018, tm_mon=2, tm_mday=17, tm_hour=18, tm_min=59, tm_sec=17, tm_w day=5, tm_yday=48, tm_isdst=0) In [27]: a = time.localtime() In [28]: a.tm_year Out[28]: 2018 In [29]: a.tm_mon Out[29]: 2 In [30]: "%s-%s-%s"%(a.tm_year,a.tm_mon,a.tm_mday) # 格式化输出 Out[30]: '2018-2-17'
# 0时区 当前时间 结构化时间 In [31]: time.gmtime() Out[31]: time.struct_time(tm_year=2018, tm_mon=2, tm_mday=17, tm_hour=11, tm_min=2, tm_sec=29, tm_wday=5, tm_yday=48, tm_isdst=0)
# 结构化转换为时间戳 In [33]: time.mktime(a) Out[33]: 1518865175.0 In [34]: a Out[34]: time.struct_time(tm_year=2018, tm_mon=2, tm_mday=17, tm_hour=18, tm_min=59, tm_sec=35, tm_wday=5, tm_yday=48, tm_isdst=0)
# 表示为这种形式:'Sun Oct 1 12:04:38 2017' In [44]: time.asctime() Out[44]: 'Sat Feb 17 19:08:53 2018' # 把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式 In [45]: time.ctime() Out[45]: 'Sat Feb 17 19:09:32 2018' In [46]: time.ctime(123232) Out[46]: 'Fri Jan 2 18:13:52 1970' In [47]: time.ctime(0) Out[47]: 'Thu Jan 1 08:00:00 1970' In [48]: time.ctime(+100) Out[48]: 'Thu Jan 1 08:01:40 1970' In [49]: time.ctime(+1000000) Out[49]: 'Mon Jan 12 21:46:40 1970' In [50]: time.ctime(+10000000000) Out[50]: 'Sun Nov 21 01:46:40 2286'
4.格式化时间
格式 含义 %a 本地星期名称的简写(如星期四为Thu) %A 本地星期名称的全称(如星期四为Thursday) %b 本地月份名称的简写(如八月份为agu) %B 本地月份名称的全称(如八月份为august) %c 本地相应的日期和时间的字符串表示(如:15/08/27 10:20:06) %d 一个月中的第几天(01 - 31) %f 微秒(范围0.999999) %H 一天中的第几个小时(24小时制,00 - 23) %I 第几个小时(12小时制,0 - 11) %j 一年中的第几天(001 - 366) %m 月份(01 - 12) %M 分钟数(00 - 59) %p 本地am或者pm的标识符 %S 秒(00 - 61) %U 一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之 前的所有天数都放在第0周。 %w 一个星期中的第几天(0 - 6,0是星期天) %W 和%U基本相同,不同的是%W以星期一为一个星期的开始。 %x 本地相应日期字符串(如15/08/01) %X 本地相应时间字符串(如08:08:10) %y 去掉世纪的年份(00 - 99)两个数字表示的年份 %Y 完整的年份(4个数字表示年份) %z 与UTC时间的间隔(如果是本地时间,返回空字符串) %Z 时区的名字(如果是本地时间,返回空字符串) %% ‘%’字符
# strftime() 格式化时间 In [56]: a Out[56]: time.struct_time(tm_year=2018, tm_mon=2, tm_mday=17, tm_hour=18, tm_min=59, tm_sec=35, tm_wday=5, tm_yday=48, tm_isdst=0) In [55]: time.strftime('%Y-%m-%d') Out[55]: '2018-02-17' In [57]: time.strftime('%Y-%m-%d %H:%M:%S',a) Out[57]: '2018-02-17 18:59:35' In [58]: time.strftime('%Y-%m-%d %H:%M:%S %A',a) Out[58]: '2018-02-17 18:59:35 Saturday' In [59]: time.strftime('%Y-%m-%d %H:%M:%S %a',a) Out[59]: '2018-02-17 18:59:35 Sat' In [60]: time.strftime('%Y-%m-%d %H:%M:%S %p',a) Out[60]: '2018-02-17 18:59:35 PM' In [61]: time.strftime('%Y-%m-%d %H:%M:%S %U',a) Out[61]: '2018-02-17 18:59:35 06' In [64]: time.strftime('%Y-%m-%d %H:%M:%S %U') Out[64]: '2018-02-17 19:14:29 06' In [65]: time.strftime('%Y-%m-%d %H:%M:%S %w') Out[65]: '2018-02-17 19:14:33 6' In [66]: time.strftime('%Y-%m-%d %H:%M:%S %W') Out[66]: '2018-02-17 19:14:36 07' In [67]: time.strftime('%Y-%m-%d %H:%M:%S %z') Out[67]: '2018-02-17 19:14:39 Öйú±ê׼ʱ¼ä' In [68]: time.strftime('%Y-%m-%d %H:%M:%S %Z') Out[68]: '2018-02-17 19:14:44 Öйú±ê׼ʱ¼ä'
5.转换关系
6.datetime模块
相比于time模块,datetime模块的接口则更直观、更容易调用
datetime模块定义了下面这几个类:
datetime.date:表示日期的类。常用的属性有year, month, day; datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond; datetime.datetime:表示日期时间。 datetime.timedelta:表示时间间隔,即两个时间点之间的长度。 datetime.tzinfo:与时区有关的相关信息。(这里不详细充分讨论该类,感兴趣的童鞋可以参考python手册)
我们需要记住的方法仅以下几个:
1.d=datetime.datetime.now() 返回当前的datetime日期类型
d.timestamp(),d.today(), d.year,d.timetuple()等方法可以调用 In [5]: datetime.datetime.now() Out[5]: datetime.datetime(2018, 2, 17, 19, 22, 27, 966803) In [9]: d.timestamp() Out[9]: 1518866577.650586 In [10]: d.today() Out[10]: datetime.datetime(2018, 2, 17, 19, 23, 17, 125420) In [11]: d.year Out[11]: 2018 In [12]: d.timetuple() Out[12]: time.struct_time(tm_year=2018, tm_mon=2, tm_mday=17, tm_hour=19, tm_min=22, tm_sec=57, tm_wday=5, tm_yday=48, tm_isdst=-1)
2.datetime.date.fromtimestamp(322222) 把一个时间戳转为datetime日期类型
In [13]: datetime.date.fromtimestamp(3232323)
Out[13]: datetime.date(1970, 2, 7)
3.时间运算
>>> datetime.datetime.now() datetime.datetime(2017, 10, 1, 12, 53, 11, 821218) >>> datetime.datetime.now() + datetime.timedelta(4) #当前时间 +4天 datetime.datetime(2017, 10, 5, 12, 53, 35, 276589) >>> datetime.datetime.now() + datetime.timedelta(hours=4) #当前时间+4小时 datetime.datetime(2017, 10, 1, 16, 53, 42, 876275)
In [21]: datetime.datetime.now() + datetime.timedelta(years=4) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-21-764417f227f6> in <module>() ----> 1 datetime.datetime.now() + datetime.timedelta(years=4) TypeError: 'years' is an invalid keyword argument for this function
4.时间替换
>>> d.replace(year=2999,month=11,day=30) datetime.date(2999, 11, 30)