Python 常用基础模块:时间模块

Posted Amo Xiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 常用基础模块:时间模块相关的知识,希望对你有一定的参考价值。

目录

一、datetime模块

1.1 datetime模块介绍

datetime 模块中提供了多种操作日期和时间的类,还提供了一系列由简单到复杂的日期时间处理方法,可以实现以各种不同方式创建和输出日期与时间信息。另外,本模块中还包含对时区及夏令时信息的处理方法。本文只介绍开发过程中常用的方法。

now()方法——返回指定时区的本地日期时间

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)

参数说明:

  1. tz:可选参数。如果提供了参数 tz,则获取 tz 所指时区的本地时间;如果不指定参数 tz 或参数 tz 为 None,则结果和 datetime.today() 结果相同。
  2. 返回值:返回一个表示当前本地日期时间的 datetime 对象。

分别使用 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 <class 'datetime.datetime'>
2022-06-27 01:16:14.089357 <class 'datetime.datetime'>

timedelta类

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):

参数说明:

  1. days:表示天,取值范围:[-999999999, 999999999]。
  2. seconds:表示秒,取值范围:[0, 86399]。
  3. microseconds:表示微秒,取值范围:[0, 999999]。

所有的参数都是可选参数,默认值为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

strftime()方法——根据自定义的格式返回时间字符串

datetime 类中的 strftime() 方法用于根据自定义的格式返回时间字符串。语法格式如下:

datetime对象名.strftime(format)

参数说明:

  1. format :表示指定的显示格式。
  2. 返回值:返回 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 <class 'str'>
2022-06-27 03:36:06.255339
03:36:06 <class 'str'>

strptime()方法——获取对应的datetime对象

datetime 类中的 strptime() 方法用于根据指定的日期时间字符串与格式,获取对应的 datetime 对象。语法格式如下:

datetime.strptime(date_string, format)

参数说明:

  1. date_string:表示指定的日期时间字符串。
  2. format :表示指定日期时间字符串的格式。
  3. 返回值:返回指定格式的日期时间字符串对应的 datetime 对象。

使用 strptime() 方法根据指定的日期时间字符串与格式获取对应的 datetime 对象,代码如下:

from datetime import datetime  # 导入datetime模块中的datetime类

dt = datetime.strptime("27/06/22 01:44", "%d/%m/%y %H:%M")
print(dt)  # 打印日期时间对象

timestamp()方法——返回当前时间的时间戳

datetime 类中的 timestamp() 方法用于获取当前日期时间对象所对应的时间戳。语法格式如下:

datetime对象名.timestamp()

参数说明:返回值:返回当前日期时间对象所对应的时间戳。

使用 timestamp() 方法获取当前日期时间对象所对应的时间戳,代码如下:

from datetime import datetime  # 导入datetime模块中的datetime类

dt = datetime.today()  # 获取当前日期时间
print(dt.timestamp())  # 打印对应的时间戳

fromtimestamp()方法——根据时间戳返回 date对象

datetime 类中的 fromtimestamp() 方法用于获取指定时间戳对应的 datetime 对象。语法格式如下:

datetime.fromtimestamp(timestamp)

参数说明:

  1. timestamp:指定的时间戳
  2. 返回值:返回指定时间戳对应的 datetime 对象

使用 fromtimestamp() 方法获取指定时间戳的 date 对象,代码如下:

from datetime import datetime          # 导入datetime模块中的datetime类

print(datetime.fromtimestamp(datetime.now().timestamp())) # 打印当前时间戳对应的datetime对象
print(type(datetime.fromtimestamp(datetime.now().timestamp()))) # 打印当前时间戳对应的datetime对象

二、time模块

2.1 time模块介绍

time 模块提供了各种时间相关的函数,该模块中对于时间表示的格式有如下三种:

(1) 时间戳(timestamp):时间戳表示的是从1970 年1 月1 日 00:00:00 开始按秒计算的偏移量
(2) 时间元组(struct_time):共有九个元素,分别为:年、月、日、时、分、秒、一周中的第几日、一年中的第几日、夏令时
(3) 格式化时间字符串(format time):已格式化的结构使时间更具可读性,包括自定义格式和固定格式

时间元组

在 Python 中,使用 9 个元素组成的元组来处理时间,我们称之为时间元组(struct_time 元组)。时间元组中 9 个元素分别为:年、月、日、时、分、秒、一周中的第几日、一年中的第几日、夏令时。struct_time 元组的含义及属性如下表所示:

localtime()方法——接收时间戳并返回本地时间的时间元组

localtime() 方法用于将时间戳转换为本地时间的时间元组。语法格式如下:

time.localtime([secs])

参数说明:

  1. secs:转换为 time.struct_time 类型的对象的秒数。如果 secs 参数未提供或为 None,则返回当前时间(即默认调用 time.time())
  2. 返回值:返回指定时间戳对应的本地时间的时间元组

使用 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()方法——按指定的秒数使程序休眠若干时间

sleep() 方法的作用是休眠,使程序按指定的秒数休眠若干时间。语法格式如下:

time.sleep(secs)

参数说明:

  1. secs:休眠执行的秒数。secs 以秒为单位,如果想定时毫秒,可以使用小数,以便指示更精确地暂停时间。如 0.1 秒,则代表暂停 100 毫秒
  2. 返回值:无

使用 sleep() 方法实现延迟 5 秒,然后通过 print() 函数输出文本内容,代码如下:

import time  # 导入time模块

time.sleep(5)  # 延迟5秒
print('人生苦短,我用Python!')

time()方法——返回当前时间的时间戳

时间戳(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()方法——把日期格式转为字符串格式

strftime() 方法用于格式化日期,把日期格式转换为字符串格式。该方法可以接收时间元组或者 struct_time(如由 localtime() 或 gmtime() 返回的),按照指定格式转换为字符串格式,格式由参数 format 决定。语法格式如下:

time.strftime(format[,t])

参数说明:

  1. format :时间字符串所对应的格式,格式符号参考之前的表
  2. t:可选参数,一个 struct_time 对象。如果没有提供 t,则使用 localtime() 返回的当前时间
  3. 返回值:返回以可读字符串表示的时间

使用 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()方法——把时间字符串转为时间元组

strptime() 方法用于根据指定的格式把一个时间字符串转为时间元组,语法格式如下:

time.strptime(string[,format])

参数说明:

  1. string:表示时间字符串。
  2. format :表示时间字符串所对应的格式,格式符号参考表2。
  3. 返回值:返回 struct_time 对象。

使用 strptime() 方法将指定的时间字符串转换为时间元组,代码如下:

import time  # 导入time模块

print(time.strptime("2020-07-29 21:36:54", "%Y-%m-%d %H:%M:%S"))  # 将时间字符串转为时间元组

以上是关于Python 常用基础模块:时间模块的主要内容,如果未能解决你的问题,请参考以下文章

python日期和时间

python 计算时间差秒?

Python 常用基础模块:时间模块

python基础--常用模块

Python基础-第五天-常用模块

Python基础-常用模块