Python中时间的基本概念(第1节)


在繁忙的工作和生活中,我们每个人每天都在和时间打交道。同样,在几乎所有的编程语言中,都需要与时间打交道。在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