Python 日期时间与字符串的相互转换
Python 程序中经常要用到日期时间相关的功能。这里简单总结一下。
表示日期时间常用三种形式:
- 秒为单位的浮点数
- struct_time 元组
- 时间字符串
第一种方式是效率最高的,但是输出的结果对用户不友好。比如下面的例子:
import time; # 引入time模块
ticks = time.time()
print ("当前时间戳为:", ticks)
输出的结果是:
当前时间戳为: 1558496090.8486245
这里的 1558496090.8486245 就是表示时间的浮点数。如果我们只需要精确到秒,可以忽略小数点后面的部分。
秒为单位的浮点数 转换为 时间元组
我们可以通过 time.localtime() 将其转化为时间元组:
tm_struct = time.localtime(ticks)
print(tm_struct)
得到的结果如下:
time.struct_time(tm_year=2019, tm_mon=5, tm_mday=22, tm_hour=11, tm_min=34, tm_sec=50, tm_wday=2, tm_yday=142, tm_isdst=0)
这个结果说明 1558496090.8486245 表示的时间是:
2019-5-22 11:34:50 周三,是今年的第 142 天
有时我们需要得到 格林威治时间,那么可以用 time.gmtime() 函数:
time.gmtime(ticks)
输出如下:
time.struct_time(tm_year=2019, tm_mon=5, tm_mday=22, tm_hour=3, tm_min=34, tm_sec=50, tm_wday=2, tm_yday=142, tm_isdst=0)
因为北京在东 8 区,所以我们的时间比格林威治时间超前 8 个小时。
时间元组转换为秒为单位的浮点数
使用 time.mktime() 函数可以实现时间元组转换为秒为单位的浮点数。
下面是一个例子:
time.mktime(tm_struct)
输出结果如下:
1558496090.0
可以看到,小数点后面的部分被抹去了。因为时间元组只能精确到秒。
时间元组转换为时间字符串
转换方法有很多,最简单的是 asctime():
time_str = time.asctime( tm_struct )
print(time_str)
输出的结果如下:
Wed May 22 11:34:50 2019
这样得到的字符串我们无法控制格式。如果要精确控制格式,我们可以使用 strftime():
time.strftime("%Y-%m-%d %H:%M:%S", tm_struct)
time.strftime("%a %b %d %H:%M:%S %Y", tm_struct)
输出的结果如下:
'2019-05-22 11:34:50'
'Wed May 22 11:34:50 2019'
strftime 支持的格式控制包括:
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
时间字符串 转换为 时间元组
函数 time.strptime() 可以完成这个转换,下面是个例子:
tm2_struct = time.strptime('2019-05-22 11:34:50', "%Y-%m-%d %H:%M:%S")
print(tm2_struct)
输出的结果如下:
time.struct_time(tm_year=2019, tm_mon=5, tm_mday=22, tm_hour=11, tm_min=34, tm_sec=50, tm_wday=2, tm_yday=142, tm_isdst=-1)
秒为单位的浮点数 转换为 时间字符串
time.ctime() 类似于 time.asctime(), 请看下面的例子:
time.ctime(ticks)
输入结果如下:
'Wed May 22 11:34:50 2019'
如果想精确控制输出的字符串,我没查到有现成的函数。估计只能先转成元组,然后在格式化成字符串。
我自己写了个转换函数:
def time2str(ticks, fmt='%a %b %d %H:%M:%S %Y'):
tm = time.localtime(ticks)
return time.strftime(fmt, tm)
测试代码:
time2str(ticks, "%Y-%m-%d %H:%M:%S")
输出结果如下:
'2019-05-22 12:54:36'
时间字符串 转换为 秒为单位的浮点数
这个我也没查到有函数能直接做这个转换。但是我们可以自己写一个。
def str2time(str, fmt='%a %b %d %H:%M:%S %Y'):
tm = time.strptime(str, fmt)
return time.mktime(tm)
下面是个简单的测试用例:
str2time('2019-05-22 11:34:50', "%Y-%m-%d %H:%M:%S")
输出结果如下:
1558496090.0