Python 日期时间与字符串的相互转换

Python 程序中经常要用到日期时间相关的功能。这里简单总结一下。

表示日期时间常用三种形式:

  1. 秒为单位的浮点数
  2. struct_time 元组
  3. 时间字符串

第一种方式是效率最高的,但是输出的结果对用户不友好。比如下面的例子:

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