在繁忙的工作和生活中,我们每个人每天都在和时间打交道。同样,在几乎所有的编程语言中,都需要与时间打交道。在Python中,与时间处理有关的模块包括time模块,datetime模块以及calendar模块。
时间的基本概念
1、关于时区概念:
GMT:即格林威治标准时间。(目前只用到这个) UTC:世界协调时间,与GMT类似,但比格林威治更精确。 DST:其中的“D”即Daylight,表示夏令时。 CST:美国、澳大利亚、中国、古巴的标准时间。
(1)、格林威治标准时间GMT
十七世纪,格林威治皇家天文台为了海上霸权的扩张计划而进行天体观测。1675年旧皇家观测所(Old Royal Observatory) 正式成立,到了1884年决定以格林威治的子午线作为划分地球东西两半球的经度零度。观测所门口墙上有一个标志24小时的时钟,显示当下的时间,对全球而言,这里所设定的时间是世界时间参考点,全球都以格林威治的时间作为标准来设定时间,这就是我们耳熟能详的「格林威治标准时间(Greenwich Mean Time,简称G.M.T.)的由来。
(2)、世界协调时间UTC
多数的两地时间表都以GMT来表示,但也有些两地时间表上看不到GMT字样,出现的反而是UTC这3个英文字母,究竟何谓UTC?事实上,UTC指的是Coordinated Universal Time,中文意思是世界协调时间(又称世界标准时间、世界统一时间),是经过平均太阳时(以格林威治时间GMT为准)、地轴运动修正后的新时标以及以「秒」为单位的国际原子时所综合精算而成的时间,计算过程相当严谨精密,因此若以「世界标准时间」的角度来说,UTC比GMT来得更加精准。其误差值必须保持在0.9秒以内,若大于0.9秒则由位于巴黎的国际地球自转事务中央局发布闰秒,使UTC与地球自转周期一致。所以基本上UTC的本质强调的是比GMT更为精确的世界时间标准,不过对于现行表款来说,GMT与UTC的功能与精确度是没有差别的。
(3)、中国北京时间UTC+8
伦敦位于格林威治经线上,因此其标准时间与格林威治时间一致,也就是UTC+0,伦敦的时区也被称为格林威治标准时间(GMT)。整个地球分为二十四时区,每个时区都有自己的本地时间,中国位于东八区,标准时间为UTC+8。中国距离格林威治经线约为东经116°,因此中国的标准时间比格林威治时间快8个小时,也就是UTC+8。这样设计的原因是为了与中国的各个省份保持相对一致的时间,便于统一管理。
2、时间戳
时间戳(Timestamp)是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
时间戳是计算机编程中常见的一种术语,它是用来给计算机记录时间的一种方式。通常所用到的领域就是记录一个事件所发生的时间,文件的创建时间和修改时间等方面。时间戳是用一串数字来表达的,表示格林威治时间1970年01月01日00时00分00秒到现在的时间长度,它是以秒为单位来计算的。
在Python中,时间戳通过time.time()来获取,例如:
动手练一练:
import time
print(time.time()) #获取当前时间戳
执行以上代码,输出结果为:
1712757041.126623
上面的例子中,通过调用time模块的time()函数可以获得当前时间的时间戳。从输出的结果可以看出,时间戳是一个表示时间的浮点数,它表示自1970年1月1日零点以来的秒数。
3、时间日期格式化符号
在Python编程中,处理时间日期是一个常见的任务。而利用符号格式化日期则是处理时间日期的一种常用方法。通过符号格式化,我们可以将日期和时间以特定的格式呈现出来,使其更易于阅读和理解。例如:
动手练一练:
import time
print(time.strftime("%Y-%m-%d %H:%M:%S")) # 输出 2024-04-11 08:50:32
执行以上代码,输出结果为:
2024-04-11 08:50:32
上面的例子中,利用time.strftime("%Y-%m-%d %H:%M:%S")方法可以获得一个格式化时间字符串。其中“%Y-%m-%d”格式化输出“2024-04-11”,“%H:%M:%S”格式化输出“08:50:32”。注意格式化符号中的短横线“-”和冒号“:”都是美观修饰符号,我们可以根据自己的需求更改,真正起控制作用的是百分符“%”加上一个字母,其中每一个字母所代表的意义如下表所示,注意大小写的区别:
符号 | 含义 |
---|---|
%y | 两位数的年份表示(00-99) |
%Y | 四位数的年份表示(0000-9999) |
%m | 月份(01-12) |
%d | 月内中的一天(0-31) |
%H | 24小时制小时数(0-23) |
%h | 月份的英文缩写 |
%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),星期天为星期的开始,0是星期天 |
%W | 一年中的星期数(00-53)星期一为星期的开始 |
%x | 本地相应的日期表示 |
%X | 本地相应的时间表示 |
%Z | 当前时区的名称 |
%% | %号本身 |
动手练一练:
import time
print(time.strftime("%y")) # 输出 24(两位数的年份表示)
print(time.strftime("%Y")) # 输出 2024(四位数的年份表示)
print(time.strftime("%m")) # 输出 4(月份)
print(time.strftime("%d")) # 输出 11(月内中的一天)
print(time.strftime("%H")) # 输出 9(24小时制小时数)
print(time.strftime("%h")) # 输出 Apr(月份的英文缩写)
print(time.strftime("%I")) # 输出 9(12小时制小时数)
print(time.strftime("%M")) # 输出 27(分钟数)
print(time.strftime("%S")) # 输出 30(秒)
print(time.strftime("%a")) # 输出 Thu(本地简化星期名称)
print(time.strftime("%A")) # 输出 Thursday(本地完整星期名称)
print(time.strftime("%b")) # 输出 Apr(本地简化的月份名称)
print(time.strftime("%B")) # 输出 April(本地完整的月份名称)
print(time.strftime("%c")) # 输出 Thu Apr 11 09:27:30 2024(本地相应的日期表示和时间表示)
print(time.strftime("%j")) # 输出 102(年内的一天)
print(time.strftime("%p")) # 输出 AM(本地A.M.或P.M.的等价符)
print(time.strftime("%U")) # 输出 14(一年中的星期数,星期天为星期的开始)
print(time.strftime("%w")) # 输出 4(星期,星期天为星期的开始,0是星期天)
print(time.strftime("%W")) # 输出 15(一年中的星期数,星期一为星期的开始)
print(time.strftime("%x")) # 输出 04/11/24(本地相应的日期表示)
print(time.strftime("%X")) # 输出 9:27:30(本地相应的时间表示)
print(time.strftime("%Z")) # 输出 中国标准时间(当前时区的名称)
print(time.strftime("%%")) # 输出 %(%号本身)
4、结构化时间
结构化时间就是一个包含了年月日时分秒的多元元组,我们可以通过time.localtime()等方法可以获得一个结构化时间元组。例如:
动手练一练:
import time
print(time.localtime())
执行以上代码,输出结果为:
time.struct_time(tm_year=2024, tm_mon=4, tm_mday=11, tm_hour=9, tm_min=55, tm_sec=31, tm_wday=3, tm_yday=102, tm_isdst=0)
上面的例子中,结构化时间元组共有9个元素,按顺序排列如下表:
索引 | 属性 | 取值范围 |
---|---|---|
0 | tm_year(年) | 比如 2024 |
1 | tm_mon(月) | 1 - 12 |
2 | tm_mday(日) | 1 - 31 |
3 | tm_hour(时) | 0 - 23 |
4 | tm_min(分) | 0 - 59 |
5 | tm_sec(秒) | 0 - 59 |
6 | tm_wday(weekday) | 0 - 6(0表示周一) |
7 | tm_yday(一年中的第几天) | 1 - 366 |
8 | tm_isdst(是否是夏令时) | 默认为-1 |
既然time.localtime()函数返回的是一个包含年、月、日、时、分、秒等信息的时间元组,那么我们就可以通过索引进行取值,也可以进行分片,或者通过属性名获取对应的值。例如:
动手练一练:
import time
now = time.localtime()
print(now)
# 输出 time.struct_time(tm_year=2024, tm_mon=4, tm_mday=11, tm_hour=10, tm_min=56, tm_sec=26, tm_wday=3, tm_yday=102, tm_isdst=0)
print("-------这是虚线-------")
print(now[2]) # 输出 11
print("-------这是虚线-------")
print(now[1:4]) # 输出 (4, 11, 10)
print("-------这是虚线-------")
print(now.tm_year) # 输出 2024
执行以上代码,输出结果为:
time.struct_time(tm_year=2024, tm_mon=4, tm_mday=11, tm_hour=10, tm_min=56, tm_sec=26, tm_wday=3, tm_yday=102, tm_isdst=0)
-------这是虚线-------
11
-------这是虚线-------
(4, 11, 10)
-------这是虚线-------
2024