1、概述
Python 提供了 time、datetime模块用于时间相关的处理,如获取当前系统时间,时间格式化,时区识别等操作。
本文采用几个问题的方式进行描述,主要是一些常用的场景。
使用之前,先导入我们需要使用的这两个模块。
from datetime import datetime
from time import time
2、time.struct_time元组类型
举个对应数据类型的例子:
time.struct_time(tm_year=2020, tm_mon=3, tm_mday=13, tm_hour=12, tm_min=13, tm_sec=55, tm_wday=4, tm_yday=73, tm_isdst=-1)
是一个元组,与java类比的话可以理解成java.util.Date类,能获取毫秒数,获取年、月、日、时分秒等,有了这样一组数据结构之后我们就可以集中表示时间了。
gmtime() 、 localtime() 和 strptime() 三个方法可以返回这个元组类型。
time.struct_time是一个带有 named tuple 接口的对象:可以通过索引和属性名访问值。这个元组结构里面包含的属性与值的描述信息,列举如下:
索引 | 属性 | 值 |
---|---|---|
0 | tm_year | (例如,1993) |
1 | tm_mon | range [1, 12] |
2 | tm_mday | range [1, 31] |
3 | tm_hour | range [0, 23] |
4 | tm_min | range [0, 59] |
5 | tm_sec | range [0, 61]; 见 strftime() 介绍中的 (2) |
6 | tm_wday | range [0, 6] ,周一为 0 |
7 | tm_yday | range [1, 366] |
8 | tm_isdst | 0, 1 或 -1;如下所示 |
9 | tm_zone | 时区名称的缩写 |
10 | tm_gmtoff | 以秒为单位的UTC以东偏离 |
3、如何获取当前系统时间?
time和datetime都可以获取当前时间,但是输出格式是不同的。
举个例子:
import datetime
# 普通的时间格式化操作
import time
print("time获取当前时间:", time.time())
print("datetime获取当前时间:", datetime.datetime.now())
print("time获取当前一个可读的时间格式,是英文的:", time.asctime())
输出结果:
time获取当前时间: 1584086327.549221
datetime获取当前时间: 2020-03-13 15:58:47.549221
time获取当前一个可读的时间格式,是英文的: Fri Mar 13 15:58:47 2020
我们在实际项目中大都会再次进行格式化,处理为我们更容易理解的时间格式。
4、如何获取当前系统时区?
时区应用场景可能会在跨国家等地方用到,比如国内主要使用的时区是北京(东八区),国外如:东京(东九区)、伦敦(中时区)、纽约(西五区);
举个例子:
# 普通的时间格式化操作
import time
print("格林威治标准下的时区:", time.strftime("%z", time.gmtime()))
print("当地的时区:", time.strftime("%z", time.localtime()))
输出结果:
格林威治标准下的时区: +0800
当地的时区: +0800
关于时区可以看本文结尾处的参考资料。
5、如何格式化时间?
格式化时间一般是针对struct_time元组转字符串,字符串转struct_time元组等操作。
举个例子:
# 普通的时间格式化操作
import time
# 包含有对时区的操作
import datetime
# 普通的时间格式化操作
import time
print("获取当前时区下的时间struct_time元组:", time.localtime())
print("struct_time元组转字符串:", time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()))
print("字符串转struct_time元组:", time.strptime("2020-03-13 12:13:55","%Y-%m-%d %H:%M:%S"))
关键函数:strftime与strptime注意两个函数一字之差。
输出结果:
获取当前时区下的时间struct_time元组: time.struct_time(tm_year=2020, tm_mon=3, tm_mday=13, tm_hour=16, tm_min=4, tm_sec=27, tm_wday=4, tm_yday=73, tm_isdst=0)
struct_time元组转字符串: 2020-03-13 08:04:27
字符串转struct_time元组: time.struct_time(tm_year=2020, tm_mon=3, tm_mday=13, tm_hour=12, tm_min=13, tm_sec=55, tm_wday=4, tm_yday=73, tm_isdst=-1)
从例子中我们看到 字符串转换过程我们看到有%Y-%m-%d %H:%M:%S 类似的格式化符号,这个与Java中的"yyyy-MM-dd HH:mm:ss"格式化符号有一定的区别。
在Python3中格式化符合的描述信息,如下表所示:
序号 | 指令 | 意义 |
---|---|---|
1 | %a | 本地化的缩写星期中每日的名称。 |
2 | %A | 本地化的星期中每日的完整名称。 |
3 | %b | 本地化的月缩写名称。 |
4 | %B | 本地化的月完整名称。 |
5 | %c | 本地化的适当日期和时间表示。 |
6 | %j | 十进制数 [001,366] 表示的年中日。 |
7 | %y | 十进制数 [00,99] 表示的没有世纪的年份。如19、20 |
8 | %Y | 十进制数表示的带世纪的年份。如2019、2020 |
9 | %m | 十进制数 [01,12] 表示的月。 |
10 | %d | 十进制数 [01,31] 表示的月中日。如01、02 |
11 | %H | 十进制数 [00,23] 表示的小时(24小时制)。 |
12 | %I | 十进制数 [01,12] 表示的小时(12小时制)。 |
13 | %M | 十进制数 [00,59] 表示的分钟。 |
14 | %p | 本地化的 AM 或 PM 。 |
15 | %S | 十进制数 [00,61] 表示的秒。 |
16 | %U | 十进制数 [00,53] 表示的一年中的周数(星期日作为一周的第一天)作为。在第一个星期日之前的新年中的所有日子都被认为是在第0周。 |
17 | %w | 十进制数 [0(星期日),6] 表示的周中日。 |
18 | %W | 十进制数 [00,53] 表示的一年中的周数(星期一作为一周的第一天)作为。在第一个星期一之前的新年中的所有日子被认为是在第0周。 |
19 | %x | 本地化的适当日期表示。 |
20 | %X | 本地化的适当时间表示。 |
21 | %z | 时区偏移以格式 +HHMM 或 -HHMM 形式的 UTC/GMT 的正或负时差指示,其中H表示十进制小时数字,M表示小数分钟数字 [-23:59, +23:59] 。可以输出时区 |
22 | %Z | 时区名称(如果不存在时区,则不包含字符)。 |
23 | %% | 字面的 ‘%’ 字符。 |
# 6、完整代码
import datetime
import time
print("time获取当前时间:", time.time())
print("datetime获取当前时间:", datetime.datetime.now())
print("time获取当前一个可读的时间格式,是英文的:", time.asctime())
print("========格式化与转换=========")
print("获取当前时区下的时间struct_time元组:", time.localtime())
print("struct_time元组转字符串:", time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime()))
print("字符串转struct_time元组:", time.strptime("2020-03-13 12:13:55", "%Y-%m-%d %H:%M:%S"))
print("=========获取时区========")
print("格林威治标准下的时区:", time.strftime("%z", time.gmtime()))
print("当地的时区:", time.strftime("%z", time.localtime()))
输出:
time获取当前时间: 1584087845.7794068
datetime获取当前时间: 2020-03-13 16:24:05.779406
time获取当前一个可读的时间格式,是英文的: Fri Mar 13 16:24:05 2020
========格式化与转换=========
获取当前时区下的时间struct_time元组: time.struct_time(tm_year=2020, tm_mon=3, tm_mday=13, tm_hour=16, tm_min=24, tm_sec=5, tm_wday=4, tm_yday=73, tm_isdst=0)
struct_time元组转字符串: 2020-03-13 08:24:05
字符串转struct_time元组: time.struct_time(tm_year=2020, tm_mon=3, tm_mday=13, tm_hour=12, tm_min=13, tm_sec=55, tm_wday=4, tm_yday=73, tm_isdst=-1)
=========获取时区========
格林威治标准下的时区: +0800
当地的时区: +0800
7、总结
struct_time元组类型,这是可以当成java中的Date类来理解,就是一种数据结构。
时间格式化符号需要掌握一些常用的,如文中标黄的一些,可以重点关注,其余的可以在实践中回查。
datetime 没有更多的进行实践,可以参看文章结尾的链接,进行更深入的学习。
参考资料:
[1]、百度百科-时区
[2]、维基百科-时区
[3]、datetime官方链接