Python标准库datetime与time

起因

开发过程中遇到了时间格式的更改需求。源时间格式从zstack接口获取,类似这样的格式Dec 14, 2018 7:55:13 PM,要转换成目标格式,类似这样2018-12-14 19:55:13。其实只要在Python编程中遇到了和时间相关的问题,都可以用标准库datetimetime模块解决。

常用场景
字符串时间格式更改

先将源字符串时间用strptime转换成时间数组,然后将时间数组用strftime转换为目标格式的字符串。
例如将字符串Dec 14, 2018 7:55:13 PM转换为2018-12-14 19:55:13

1
2
3
4
5
>>> from datetime import datetime
>>> t = datetime.strptime("Dec 14, 2018 7:55:13 PM","%b %d, %Y %I:%M:%S %p")
>>> t.strftime("%Y-%m-%d %H:%M:%S")
'2018-12-14 19:55:13'
>>>

time模块也可以实现,稍有不同。

1
2
3
4
5
>>> import time
>>> t= time.strptime("Dec 14, 2018 7:55:13 PM","%b %d, %Y %I:%M:%S %p")
>>> time.strftime("%Y-%m-%d %H:%M:%S", t)
'2018-12-14 19:55:13'
>>>

做时间操作需要知道日期和时间的格式化参数,找到正确的时间格式参数,然后对号入座。
常用格式参数:

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
32
33
34
35
36
%a    星期几简写
%A 星期几全称
%b 月分简写
%B 月份全称
%c 标准的日期时间串
%C 年份后两位数字
%d 十进制表示每月第几天
%D 月/天/年
%e 在两字符域中,十进制表示每月第几天
%F 年-月-日
%g 年份的后两位数字,使用基于周的年
%G 年分,使用基于周的年
%h 简写月份名
%H 24小时制小时
%I 12小时制小时
%j 十进制表示每年第几天
%m 十进制表示月份
%M 十时制表示分钟数
%n 换行符
%p AM或PM
%r 12小时制时间
%R 显示小时和分钟 hh:mm
%S 十进制秒数
%t 水平制表符
%T 显示时分秒 hh:mm:ss
%u 每周的第几天,星期一为第一天(0-6,星期一为0)
%U 第年的第几周,把星期日做为第一天(0-53)
%V 每年的第几周,使用基于周的年
%w 十进制表示星期几(0-6,星期天为0)
%W 每年的第几周,把星期一做为第一天(0-53)
%x 标准的日期串
%X 标准的时间串
%y 不带世纪的十进制年份(0-99)
%Y 带世纪部分的十制年份
%z,%Z 时区名称,如果不能得到时区名称则返回空字符
%% 百分号
字符串时间转换为时间戳

字符串先转为时间数组,再转换为时间戳

1
2
3
4
5
6
7
8
>>> import time
>>> t = '2018-12-14 19:55:13'
>>> tarray = time.strptime(t, "%Y-%m-%d %H:%M:%S")
>>> tarray
time.struct_time(tm_year=2018, tm_mon=12, tm_mday=14, tm_hour=19, tm_min=55, tm_sec=13, tm_wday=4, tm_yday=348, tm_isdst=-1)
>>> int(time.mktime(tarray))
1544788513
>>>
时间戳转换为指定格式时间字符串

时间戳先转换为时间数组,然后格式化为目标格式字符串

1
2
3
4
5
6
7
8
>>> import time
>>> t = 1544788513
>>> tarray = time.localtime(t)
>>> tarray
time.struct_time(tm_year=2018, tm_mon=12, tm_mday=14, tm_hour=19, tm_min=55, tm_sec=13, tm_wday=4, tm_yday=348, tm_isdst=0)
>>> time.strftime("%Y-%m-%d %H:%M:%S", tarray)
'2018-12-14 19:55:13'
>>>
获取当前时间并格式指定格式字符串
1
2
3
4
5
6
7
>>> import time
>>> tarray = time.localtime(time.time())
>>> tarray
time.struct_time(tm_year=2018, tm_mon=12, tm_mday=20, tm_hour=13, tm_min=27, tm_sec=6, tm_wday=3, tm_yday=354, tm_isdst=0)
>>> time.strftime("%Y-%m-%d %H:%M:%S", tarray)
'2018-12-20 13:27:06'
>>>

或者用datetime实现

1
2
3
4
5
6
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2018, 12, 20, 13, 29, 32, 289665)
>>> datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
'2018-12-20 13:29:53'
>>>
获取自定时间并格式

获取一天前的时间,timedelta()参数可以是days, hours, seconds, microseconds

1
2
3
4
5
6
7
>>> import datetime
>>> t = datetime.datetime.now() - datetime.timedelta(days=1)
>>> t
datetime.datetime(2018, 12, 19, 13, 32, 22, 254713)
>>> t.strftime("%Y-%m-%d %H:%M:%S")
'2018-12-19 13:32:22'
>>>
----------------本文结束 感谢阅读----------------