Python时间日期格式化之time与datetime模块总结

  在实际开发过程中,我们经常会用到日期或者时间,那么在Python中我们怎么获取时间,以及如何将时间转换为我们需要的格式呢?在之前的开发中,也曾遇到time、datetime等模块下的不同函数,这些函数名又很是相似,几次下来头都昏了,今天来彻底总结梳理一下Python中日期时间获取与格式化。

2 理论准备

首先必须做一点理论准备,不然待会都不知道为什么会有这些函数。介绍3个概念:

UTC time Coordinated Universal Time,世界协调时,又称格林尼治天文时间、世界标准时间。与UTC time对应的是各个时区的local time,也就是本地时间,例如我们的北京时间。

  epoch time表示时间开始的起点;它是一个特定的时间,不同平台上这个时间点的值不太相同,对于Unix而言,epoch time为 1970-01-01 00:00:00 UTC。

  timestamp(时间戳) 也称为Unix时间 或 POSIX时间;它是一种时间表示方式,表示从格林尼治时间1970年1月1日0时0分0秒开始到现在所经过的毫秒数,其值为float类型。 但是有些编程语言的相关方法返回的是秒数,例如我们的天下第一编程语言-Python大法就是这样(请不要反驳我)。所谓的时间戳timestamp就是当前时间与格林尼治时间1970年1月1日0时0分0秒之间过了多少秒。

  相应的,日期时间就有三种表示方法:

  1)stamptime时间戳,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。stamptime表现为一个float类型数据。

  2)struct_time时间元组,共有九个元素组。stamptime时间戳和格式化时间字符串之间的转化必须通过struct_time才行,所以struct_time时间元组时3中时间表示的中心。

  3)format time 格式化时间,已格式化的结构字符串使时间更具可读性。包括自定义格式和固定格式。

  那么,下面要说的就是怎么获取这三个时间,并进行这三个时间之间的转化。先总结一下time模块。

3 time模块

  先放两个图:

Python时间日期格式化之time与datetime模块总结

  time模块中,几乎所有时间获取与格式转化的函数都在上图中了,只要理清了这幅图的关系,那么time模块就不再是问题。图中,蓝色方块表示那三种时间格式,箭头表示时间的转化。下面,重点来了:

  1)获取当前时间的方法只有一个,那就是通过上图中的函数1——time.time()。也就是说,要想获取当前时间,只能通过这个方法,而且获取的是时间戳格式的时间。想直接获取当前时间的时间元组格式或格式化字符串?没门,只能老老实实转化。

  2)当传入默认参数时,指的是使用当前时间作为参数值。图中带黄色底纹的都是设有默认值的参数(虽然默认值为None),函数2、3不传入该参数时,系统会自动获取当前时间的时间戳作为该参数值。而函数5则是系统会自动获取当前时间的时间元组作为该参数值,不是不能直接获取当前时间的时间元组吗?是的,但系统会先获取当前时间的时间戳,然后转化为时间元组。上图中只有向左的箭头所代表的函数才有默认值,就是因为向右才能由时间戳转化得到需要的时间格式。

  3) localtime(函数2)和gmtime(函数3)都可以实现将时间戳转化为时间元组,但是,localtime转化的是本地时间,gmtime转为的是世界标准时间。

  4)asctime(函数7)和ctime(函数8)只能转为为%a %b %d %H:%M:%S %Y格式的字符串时间。不传入参数时,用的也是当前时间。

  5)struct_time元组元素结构:

下标/索引

 

属性名称

 

描述

 

0

 

tm_year

 

年份,如 2018

 

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,默认值为-1

 

  struct_time属性值的获取方式有两种:

  可以把它当做一种特殊的有序不可变序列通过 下标/索引 获取各个元素的值,如t[0]

  也可以通过对象名 “t.属性名” 的方式来获取各个元素的值,如t.tm_year。

  6)format time结构化表示:

格式

 

含义

 

%a

 

本地(locale)简化星期名称

 

%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

 

秒(01 - 61)

 

%U

 

一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。

 

%w

 

一个星期中的第几天(0 - 6,0是星期天)

 

%W

 

和%U基本相同,不同的是%W以星期一为一个星期的开始。

 

%x

 

本地相应日期

 

%X

 

本地相应时间

 

%y

 

去掉世纪的年份(00 - 99)

 

%Y

 

完整的年份

 

%Z

 

时区的名字(如果不存在为空字符)

 

%%

 

‘%’字符

 

  在代码中实践一下上面的内容:

  1)time.time()

>>> import time
>>> time.time()
1545216390.84174

  2)time.localtime()

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b917622714525eddfe165d35b902dd64.html