datetime 模块中提供了多种操作日期和时间的类,还提供了一系列由简单到复杂的日期时间处理方法,可以实现以各种不同方式创建和输出日期与时间信息。另外,本模块中还包含对时区及夏令时信息的处理方法。本文只介绍开发过程中常用的方法。
datetime 类中的 now() 方法用于返回一个表示当前本地时间的 datetime 对象。语法格式如下:
def now(cls, tz=None):
"Construct a datetime from time.time() and optional time zone info."
t = _time.time()
return cls.fromtimestamp(t, tz)
参数说明:
分别使用 today() 方法和 now() 方法获取当前本地日期时间,代码如下:
from datetime import datetime # 导入datetime模块中的datetime类
print(datetime.today(), type(datetime.today())) # 通过today方法获取当前日期时间
print(datetime.now(), type(datetime.today())) # 通过now方法获取当前日期时间
程序运行结果如下:
2022-06-27 01:16:14.089358
2022-06-27 01:16:14.089357
timedelta 类表示时间差,即两个日期或时间之间的差值。timedelta 类可以很方便地对 datetime.date、datetime.time 和 datetime.datetime 对象进行算术运算,且两个时间之间的差值单位也更加容易控制。这个差值的单位可以是:天、秒、微秒、毫秒、分钟、小时、周。datetime.timedelta 类的定义如下:
def __new__(cls, days=0, seconds=0, microseconds=0,
milliseconds=0, minutes=0, hours=0, weeks=0):
参数说明:
所有的参数都是可选参数,默认值为0,参数的值可以是整数或浮点数,可以是正数或负数。虽然参数可以传递的单位很多,但是 Python 内部实现只存储了 days、seconds 和 microseconds 三种单位,其他单位在计算时都将被转换成相应的这3 种单位:
1 millisecond = 1000 microseconds
1 minute = 60 seconds
1 hour = 3600 seconds
1 week = 7 days
说明:在传递 seconds 和 microseconds 的时候,如果这两个参数超出取值范围,Python 会自动转换,但是如果 days 超出取值范围,会抛出 OverflowError 异常。
计算两个日期之间的差值:
from datetime import timedelta # 导入datetime模块中的timedelta类
from datetime import datetime # 导入datetime模块中的datetime类
print("现在时间:", datetime.now()) # 现在时间
print("2天后:", datetime.now() + timedelta(2)) # 打印2天后
print("3天前:", datetime.now() + timedelta(-3)) # 打印3天前
print("1小时后:", datetime.now() + timedelta(hours=1)) # 打印1小时后
print("4小时前:", datetime.now() + timedelta(hours=-4)) # 打印4小时前
print("2小时20秒后:", datetime.now() + timedelta(hours=2, seconds=20)) # 打印2小时20秒后
程序运行结果如下:
现在时间: 2022-06-27 01:29:14.597947
2天后: 2022-06-29 01:29:14.597947
3天前: 2022-06-24 01:29:14.597947
1小时后: 2022-06-27 02:29:14.597947
4小时前: 2022-06-26 21:29:14.597947
2小时20秒后: 2022-06-27 03:29:34.597947
datetime 类中的 strftime() 方法用于根据自定义的格式返回时间字符串。语法格式如下:
datetime对象名.strftime(format)
参数说明:
使用 strftime() 方法获取指定格式的日期字符串,代码如下:
from datetime import timedelta # 导入datetime模块中的timedelta类
from datetime import datetime # 导入datetime模块中的datetime类
now = datetime.now()
after_two_days = now + timedelta(days=2)
print(after_two_days)
print(after_two_days.strftime("%Y-%m-%d"), type(after_two_days.strftime("%Y%M%D")))
# 两小时后
after_two_hours = now + timedelta(hours=2)
print(after_two_hours)
print(after_two_hours.strftime("%H:%M:%S"), type(after_two_hours.strftime("%H:%M:%S")))
程序运行结果如下:
2022-06-29 01:36:06.255339
2022-06-29
2022-06-27 03:36:06.255339
03:36:06
datetime 类中的 strptime() 方法用于根据指定的日期时间字符串与格式,获取对应的 datetime 对象。语法格式如下:
datetime.strptime(date_string, format)
参数说明:
使用 strptime() 方法根据指定的日期时间字符串与格式获取对应的 datetime 对象,代码如下:
from datetime import datetime # 导入datetime模块中的datetime类
dt = datetime.strptime("27/06/22 01:44", "%d/%m/%y %H:%M")
print(dt) # 打印日期时间对象
datetime 类中的 timestamp() 方法用于获取当前日期时间对象所对应的时间戳。语法格式如下:
datetime对象名.timestamp()
参数说明:返回值:返回当前日期时间对象所对应的时间戳。
使用 timestamp() 方法获取当前日期时间对象所对应的时间戳,代码如下:
from datetime import datetime # 导入datetime模块中的datetime类
dt = datetime.today() # 获取当前日期时间
print(dt.timestamp()) # 打印对应的时间戳
datetime 类中的 fromtimestamp() 方法用于获取指定时间戳对应的 datetime 对象。语法格式如下:
datetime.fromtimestamp(timestamp)
参数说明:
使用 fromtimestamp() 方法获取指定时间戳的 date 对象,代码如下:
from datetime import datetime # 导入datetime模块中的datetime类
print(datetime.fromtimestamp(datetime.now().timestamp())) # 打印当前时间戳对应的datetime对象
print(type(datetime.fromtimestamp(datetime.now().timestamp()))) # 打印当前时间戳对应的datetime对象
time 模块提供了各种时间相关的函数,该模块中对于时间表示的格式有如下三种:
(1) 时间戳(timestamp):时间戳表示的是从1970 年1 月1 日 00:00:00 开始按秒计算的偏移量
(2) 时间元组(struct_time):共有九个元素,分别为:年、月、日、时、分、秒、一周中的第几日、一年中的第几日、夏令时
(3) 格式化时间字符串(format time):已格式化的结构使时间更具可读性,包括自定义格式和固定格式
在 Python 中,使用 9 个元素组成的元组来处理时间,我们称之为时间元组(struct_time 元组)。时间元组中 9 个元素分别为:年、月、日、时、分、秒、一周中的第几日、一年中的第几日、夏令时。struct_time 元组的含义及属性如下表所示:
localtime() 方法用于将时间戳转换为本地时间的时间元组。语法格式如下:
time.localtime([secs])
参数说明:
使用 localtime() 方法获取本地当前时间的时间元组,代码如下:
import time # 导入time模块
print(time.localtime()) # 打印本地当前时间的时间元组
print(time.localtime(time.time())) # 以time.time()返回的时间戳为参数获取本地时间的时间元组
print(time.localtime(1584773763.789422)) # 将给定的时间戳转换为当地时间的时间元组
t = time.localtime()
print("本地当前时间的时间元组为:", t) # 打印本地当前时间的时间元组
print("属性名获取的年份为:", t.tm_year, "年") # 通过“.属性名”的方式获取年份
print("下标索引获取的月份为:", t[1], "月") # 通过下标索引获取月份
Python 中一些常用的时间日期格式化符号如下表所示:
完整英文星期名称和简写英文星期名称如下表所示:
完整英文月份名称和简写英文月份名称如下表所示:
sleep() 方法的作用是休眠,使程序按指定的秒数休眠若干时间。语法格式如下:
time.sleep(secs)
参数说明:
使用 sleep() 方法实现延迟 5 秒,然后通过 print() 函数输出文本内容,代码如下:
import time # 导入time模块
time.sleep(5) # 延迟5秒
print('人生苦短,我用Python!')
时间戳(timestamp) 表示的是从 1970 年1 月1 日 00:00:00 开始按秒计算的偏移量,也就是指格林尼治时间 1970 年01 月01 日00 时00 分00 秒(即北京时间1970 年01 月01 日08 时00 分00 秒)起至现在的总秒数,它返回的是 float 类型。但是在 1970 年之前的日期就无法用时间戳来表示,太遥远的日期也无法用时间戳表示,且 UNIX 和 Windows 只支持到 2038 年。
time 模块中的 time() 方法用于返回当前时间的时间戳。语法格式如下:
time.time()
参数说明:返回值:返回当前时间的时间戳。
使用 time() 方法获取当前时间戳的显示范围,代码如下:
import time # 导入time模块
print(time.time())
print("取整后的时间戳为: ", int(time.time())) # 对时间戳取整
通过 time() 方法计算一段代码的运行时间:
import time # 导入时间模块
start_time = time.time() # 记录开始时间
for i in range(1000001): # 循环输出0~1000000
print(i)
end_time = time.time() # 记录结束时间
run_time = end_time - start_time # 计算运行时间
print('运行时间: ', run_time) # 打印运行时间
strftime() 方法用于格式化日期,把日期格式转换为字符串格式。该方法可以接收时间元组或者 struct_time(如由 localtime() 或 gmtime() 返回的),按照指定格式转换为字符串格式,格式由参数 format 决定。语法格式如下:
time.strftime(format[,t])
参数说明:
使用 strftime() 方法输出不同格式的年、月、日,代码如下:
import time # 导入time模块
print(time.strftime("%Y,%m,%d")) # 输出年,月,日
print(time.strftime("%Y/%m/%d")) # 输出年/月/日
print(time.strftime("%Y-%m-%d")) # 输出年-月-日
print(time.strftime('%Y-%m-%d %H:%M:%S %A %B')) # %A输出英文星期全称,%B输出英文月份全称
print(time.strftime('%Y-%m-%d %H:%M:%S %a %b')) # %a输出英文星期简称,%b输出英文月份简称
t = (2020, 12, 13, 21, 36, 54, 3, 347, 0) # 创建一个名称为t的时间元组
# 根据提供的时间元组获取年-月-日 时:分:秒
print(time.strftime('%Y-%m-%d %H:%M:%S', t))
# 根据localtime()返回的时间获取年 月 日 时 分 秒
print(time.strftime('%Y %m %d %H %M %S', time.localtime()))
# 根据gmtime()返回的时间获取年,月,日 时:分:秒
print(time.strftime('%Y,%m,%d %H:%M:%S', time.gmtime()))
strptime() 方法用于根据指定的格式把一个时间字符串转为时间元组,语法格式如下:
time.strptime(string[,format])
参数说明:
使用 strptime() 方法将指定的时间字符串转换为时间元组,代码如下:
import time # 导入time模块
print(time.strptime("2020-07-29 21:36:54", "%Y-%m-%d %H:%M:%S")) # 将时间字符串转为时间元组