日期和时间


介绍— “等苦尽甘来的那一天山河星月都做贺礼”

日期和时间是我们日常生活中用于衡量时间流逝和安排活动重要的概念。

在计算机编程中,日期和时间通常用于记录事件发生的时间点(也叫时间戳),进行时间间隔的计算,或者格式化输出时间信息。

随着计算机应用的广泛应用,时间和日期在许多应用领域都扮演着重要角色,包括数据处理、日志分析、任务调度、网站开发、科学计算等。时间模块使得处理时间、日期、时间戳和时间间隔等操作变得更加简单和灵活。


数据类型

在 Python 中,时间概念有如下常见的数据类型:

名称 类型 举例 描述
日期 date 2023-03-03 用于表示包含年、月、日信息的日期
时间 time 10:30:20 用于表示包含时、分、秒信息的时间点
日期时间 datetime 2023-03-03
10:30:20
用于表示一个完整的日期时间对象,包括年、月、日、时、分、秒等信息。
时间戳 timestamp 1690513131934 表示自1970年1月1日00:00:00 以来的秒数。
时间间隔 timedelta - 用于表示两个日期时间之间的时间间隔。
时区信息 tzinfo 2023-07-27
323:14:40-04:00
用于表示特定时区的时间信息。

以上数据类型都是 Python 中与时间有关的数据类型,可以由 time 内置模块和 datetime 内置模块生成,在下面的教程中会接触到这些类型的详细应用。

要注意的是,datetime 既是模块名,又是类名、又是函数名,又是 Python 中的一种数据类型,这几个概念的名称完全相同。


内置模块

在 Python 中,有两个重要的模块与日期时间有关,分别是 datetime 模块和 time 模块 ,这两个模块都是用于处理日期和时间的标准库模块,但是他们在功能和应用场景上有一些区别:

区别 描述
功能范围 datetime 模块提供了完整的日期时间处理功能,更侧重于现实生活中的日期概念。
time 模块更侧重于处理与时间相关的操作,比如程序休眠、程序等待、计数等。
类型区别 datetime 模块可以创建 date 类型、time 类型、datetime 类型等数据结构。
time 模块没有专门的日期类,并不涉及日期相关的操作
适用场景 datetime 模块通常适用于日期时间的算术运算、格式化输出、时区转换等复杂操作。
time 模块通常适用于时间戳的获取和转换、工程化时间的处理。

下面让我们结合示例对这两个模块分别进行深入的学习:

datetime 模块

datetime 模块是 Python 标准库中用于处理日期和时间的模块。

其中,datetime 模块中的重要的类是 datetime 类,两者的名称相同,datetime 对象是 datetime 的结合体,涵盖了 datetime 对象的所有信息。在使用之前需要导入:

from datetime import datetime

① 创建 datetime 对象

接下来创建 datetime 对象,datetime 类的结构如下,需要按照指定内容填入数据:

datetime(year,month,day,hour = 0,minute=0,second=0,microsecond=0,tzinfo=None)

创建一个日期时间对象并查看:

# 创建一个 datetime 对象的变量
dt = datetime(2023,3,5,12,30,30)
 
# 输出结果
print(dt)

运行上面代码,结果如下,可以看出一个日期时间被输出出来:

2023-03-05 12:30:30

使用 dateime 模块也可以轻松获取当前的时间日期,生成 datetime 对象:

# 通过 datetime 方法创建 当前时间点的 datetime 对象
now = datime.now()

② 使用 datetime 对象

在 Python 中,可以访问 datetime 对象的各个成分的属性和方法,比如年、月、日、时、分、秒等。让我们创建一个日期时间对象并查看其内部属性:

# 创建一个 datetime 对象的变量
dt = datetime(2023,4,5,20,40,30)
 
# 分别查看 datetime 对象的年、月、日、时、分、秒
print(dt.year)
print(dt.month)
print(dt.day)
print(dt.hour)
print(dt.minute)
print(dt.second)
 
# 查看 datetime 对象的日期
print(dt.date())

③ 字符串解析为 datetime 对象

在程序开发中,我们会经常遇到一些不规则的日期字符串,想要将这些日期处理成标准的 datetime 格式的日期时间变量,需要使用到 strptime 方法进行转换,其写法如下:

datetime.strptime(date_string, format)

其中,date_string 是待处理的字符串,format 是待处理的字符串的日期样式结构,目的是告诉函数如何解析日期,需要与待处理的字符串完全匹配。

关于日期的字符串对应关系如下:

名称 写法 范围
%Y 0 - 9999
%m 1 - 12
%d 1 - 31
%H 0 - 23
%M 0 - 59
%S 0 - 59

让我们来看一个示例,按照日期字符串的格式编写正确的对应关系:

from datetime import datetime
 
# 创建一个字符串日期
str_date = '2023年6月10日 10点20分'
 
# 转换成 datetime 类型,日期要和字符串的位置一一对应
datetime_now = datetime.strptime(str_date , "%Y年%m月%d日 %H点%M分")
 
# 输出结果
print(datetime_now)

此时,原本的字符串格式的日期被转换为了 datetime 格式的数据,方便后续加工:

2023-06-10 10:20:00

④ 格式化 datetime 对象

和字符串解析为 datetime 对象的操作相反,我们也可以将 datetime 对象转换为想要的字符串格式,使用的是 strftime 方法,让我们通过示例来进行学习:

from datetime import datetime
 
# 创建 datetime 对象
datetime_now = datetime(2023,3,5,12,30,30)
 
# 根据需求转化成任意样式的字符串日期
str_date = datetime.strftime(datetime_now , "%Y/%m/%d %H点%M分")
 
# 输出结果
print(str_date)

运行上述代码,可以看出,我们创建的 datetime 对象已经变成指定的字符串格式:

2023/03/05 12点30分

⑤ 日期时间的运算

日期时间的运算是指对日期时间对象进行简单的数学操作。在 python 中,时间间隔对象是 timedelta 对象,可以使用 datetime 模块中的 timedelta 函数进行创建。

在 Python 中 datime 对象和 timedelta 对象可以直接进行相加或者相减,来看示例:

from datetime import datetime
from datetime import timedelta
 
# 创建一个 datetime 对象
datetime_now = datetime(2023,3,5,12,30,30)
 
# 创建一个时间间隔为 2 天 3 小时的 timedelta 对象
days = timedelta(days= 2,hours = 3)
 
# 在日期对象上加上和减去时间间隔
add_datetime = datetime_now + days
sub_datetime = datetime_now - days
 
# 输出结果
print(add_datetime)
print(sub_datetime)

运行上面代码,结果如下,可以看出创建的两个日期是原日期分别加、减了2天3小时:

2023-03-07 15:30:30
2023-03-03 09:30:30

除了上面可以传入的日、时参数外,timedelta 对象在创建时也可以传入 minutes(分钟)、seconds(秒)、microseconds(微秒)等参数。

另外 datetime 对象相减会生成 timedelta 对象,也就是两个日期之间的时间间隔,以下是一个示例:

from datetime import datetime
from datetime import timedelta
 
# 创建两个 datetime 对象
datetime1 = datetime(2023,3,5,12,30,30)
datetime2 = datetime(2023,4,15,11,20,25)
 
# 两个 datetime 对象相减
days = datetime2 - datetime1
 
# 输出结果
print(days)

运行上面代码,结果如下,可以看出两个日期的时间间隔:

40 days, 22:49:55

要注意的是,想要获取 timedelta 的属性,只可以获取日(days)、秒(seconds) 两个属性,没有时、分、月等信息,如果需要获取这些信息,则需要进行转换。


time 模块

time 模块的主要功能之一对时间戳进行操作。time.time() 可以函数返回自从 1970 年 1 月 1 日午夜以来的秒数,通常被称为 UNIX 时间戳。该模块可以很方便进行时间处理、时间戳转换、程序睡眠等操作。

该模块的应用场景非常多,具体如下:

应用 描述
获取时间戳 获取当前时间或者自定义时间时间戳,用于记录事件发生的时间或计算代码执行时间。
程序休眠 使程序暂停执行一段时间,常用于模拟等待或限制频率的场景。
时间戳转换 将不同格式的时间字符串转换为时间戳。
格式化时间 将时间转换成指定格式的字符串。

下面让我们依次来对上面的应用进行学习:

① 获取时间戳

通过 time 模块可以获取当前时间的 UNIX 时间戳,也可以使用 mktime 方法来创建自定义时间的时间戳:

import time
 
# 记录当前时间的时间戳
time1 = time.time()
 
# 使用 mktime 方法创建时间需要传入时间元组
time2 = time.mktime((2023, 6, 4, 12, 30, 45, -1, -1, -1))
 
# 输出结果
print(time1)
print(time2)

要注意的是,上面的代码中 mktime 最后传入的三个参数分别代表星期几、一年中的第几天、夏令时标志,如果不关心这些参数的话可以选择填写 -1 来略过。

另外,使用 time.time() 函数获取到的时间戳也常常用来测试程序的运行时间:

import time
 
# 记录程序开始运行的时间戳
time1 = time.time()
 
# 在这里写入其他代码,比如一个比较耗时的循环程序
 
# 记录程序结束运行时的时间戳
time2 = time.time()
 
# 计算两个时间的差值,就是运行时间
run_time = time2 - time1
 
# 输出结果
print(run_time)

上面的代码就完成了记录代码运行时间的功能,通过记录开始时间和结束时间,并计算两者的差值,就可以得到程序执行的时间,从而可以用于性能分析和优化。

② 程序休眠

使用 time.sleep() 函数可以在程序中实现休眠效果,即暂停程序执行一段时间。这个功能通常用于模拟等待、控制程序节奏、实现简单的计时器或延迟执行等情况。

下面我将在计算程序运行时间的程序中加入程序休眠的代码,让程序休眠 3 秒来测试:

import time
 
# 记录程序开始运行的时间戳
time1 = time.time()
 
time = time.time()
 
# 让程序在这里停滞 3 秒
time.sleep(3)
 
# 记录程序结束运行时的时间戳
time2 = time.time()
 
# 计算两个时间的差值,就是运行时间
run_time = time2 - time1
 
# 输出结果
print(run_time)

此时运行代码,会发现程序过了三秒后才输出结果,结果如下:

3.0025289058685303

让我们来看一个有趣的例子,通过程序休眠函数来构造一个倒计时的函数:

import time
 
# 构造一个倒计时函数,传入的参数是我们希望开始读秒的时间
def countdown(seconds):
    # 使用循环的方式来判断 seconds 参数是否归零
    while seconds > 0:
        print('剩余时间是'+ str(seconds) + '秒')
        time.sleep(1)
        seconds = seconds - 1
    print('时间到!')

接下来我调用这个函数来进行测试,随便输入一个倒计时的时间,比如 5。

countdown(5)

运行上面这个函数,程序会每隔一秒输出一次倒计时,结果如下:

剩余时间是5秒
剩余时间是4秒
剩余时间是3秒
剩余时间是2秒
剩余时间是1秒
时间到!

③ 时间戳转换

datetime 模块一样,time 模块也有 strptime 内置函数,这个方法可以解析时间字符串为时间元组,再使用 time.mktime 函数将时间元组转换为时间戳。

strptime 的转化的方式和 datetime 一样,要注意日期的对应关系,以下是一个示例:

import time
 
# 时间字符串格式是 年-月-日 时:分:秒
time_string1 = "2023-05-06 12:30:45"
 
# 时间字符串格式是 年/月/日 时:分
time_string2 = "2023/06/03 1:20"
 
# 时间字符串格式是 年月日 时分秒
time_string3 = "2023年07月06日 8时30分45秒"
 
# 将时间字符串转换为时间元组,在这里是 time.struct_time 对象
time_tuple1 = time.strptime(time_string1, "%Y-%m-%d %H:%M:%S")
time_tuple2 = time.strptime(time_string2, "%Y/%m/%d %H:%M")
time_tuple3 = time.strptime(time_string3, "%Y年%m月%d日 %H时%M分%S秒")
 
# 将时间元组转换为时间戳
timestamp1 = time.mktime(time_tuple1)
timestamp2 = time.mktime(time_tuple2)
timestamp3 = time.mktime(time_tuple3)
 
# 输出时间戳的结果
print(timestamp1)
print(timestamp2)
print(timestamp3)

运行上述代码,下面的结果就是文本字符串对应的时间戳:

1683347445.0
1685726400.0
1688603445.0

④ 格式化时间

datetime 模块一样,time 模块中也可以使用 time.strftime 函数将时间戳或时间元组 time.struct_time 格式化为指定的时间字符串。

以下是一个示例,展示如何使用 time.strftime() 函数来格式化时间,另外使用 localtime 函数可以获取当前时间的日期元组:

import time
 
# 获取当前的时间戳
current_time = time.localtime()
 
# 格式化时间为字符串
format_time = time.strftime("%Y年%m月%d %H:%M:%S", current_time)
 
# 输出结果
print(format_time)

运行上面代码,结果如下,可以看出一个按照我们需要样式的日期时间被输出了出来:

2023年06月10 11:59:57

以上就是关于 Python 时间概念涉及到的两个主要模块,再次强调一下,datetime 模块提供了更多的日期和时间处理功能,而 time 模块主要用于与时间戳和时间间隔相关的操作。根据你的需求,选择合适的模块和方法来处理时间和日期。

关注公众号【牧旗教程】,回复“更多例题”,获取更多题型进行训练~

您的打赏将帮助维护网站服务器的正常运营,并为作者的后续更新提供更多的动力。

无法显示 无法显示