time模块
Python中表示时间的方式主要有三种:
时间戳(timestamp):表示的是从1970年1月1日00:00:00(Unix元年)开始按秒计算的偏移量。
格式化时间(Format String):经过字符串格式化后的时间表示形式,例如1970-1-1 12:00:00
结构化时间(struct_time):struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时)
import time
# 1、时间戳形式
print(time.time())
# 2、格式化字符串形式
print(time.strftime("%Y-%m-%d %H:%M:%S")) # strftime需要传入格式化的形式, 字符串格式
print(time.strftime("%F %X")) # 也可以简写为这种形式
# 3、结构化时间形式
print(time.localtime()) # 本地时区的struct_time (东八区,比世界时间晚八小时)
print(time.gmtime()) # UTC时区的struct_time
输出的结果为:
计算机认识的时间只能是’时间戳’格式,而程序员可处理的或者说人类能看懂的时间有: ‘格式化的时间字符串’,‘结构化的时间’ ,于是有了下图的转换关系:
我们真正需要的时间格式是格式化字符串的时间,因此常常需要对时间进行相应的转换
1、结构化时间转为时间戳、格式化字符串
import time
print("结构化时间: ", time.localtime())
print("结构化时间转为时间戳: ", time.mktime(time.localtime()))
print("结构化时间转为格式化字符串时间: ", time.strftime("%F %X", time.localtime()))
转换结果如下:
2、时间戳与格式化字符串相互转换
由上图图1可知时间戳和格式化字符串在time模块下没有直接的互相转换方式,因此需要借助结构化时间实现转换
import time
stamptime = time.time()
struct_time = time.localtime(stamptime)
format_time = time.strftime("%F %X", struct_time)
print("时间戳: ", stamptime)
print("结构化时间: ", struct_time)
print("字符串格式化时间: ", format_time)
可以看到时间戳转换为格式化字符串时间的结果。
逆转换方式同上,不再赘述。
应用场景:一般情况下,存储的时间是时间戳\格式化字符串时间,当需要对时间进行更改的时候(VIP续费等), 格式化字符串无法直接进行加减操作,因此需要转换成对应的时间戳形式进行加减,再用原格式进行写回。
3、拓展
time.asctime:用于将给定的日期和时间转换成 ASCII 码,把一个表示时间的元组或者struct_time表示为这种形式:‘Sun Jun 20 23:21:05 1993’。
time.ctime:把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。如果参数未给或者为None的时候,将会默认time.time()为参数。它的作用相当于time.asctime(time.localtime(secs)),未指定secs则相当于time.asctime(time.localtime(time.time()))
time.sleep(secs):线程推迟secs所指定的运行时间,单位为秒
datetime模块
1、datetime.datetime.now():返回当前的时间
import datetime
print(datetime.datetime.now())
2、datetime.timedelta
timedelta 对象表示两个 date 或者 time 的时间间隔。
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
所有参数都是可选的并且默认为 0。 这些参数可以是整数或者浮点数,也可以是正数或者负数。
只有 days, seconds 和 microseconds 会存储在内部。 参数单位的换算规则如下:
1毫秒会转换成1000微秒。
1分钟会转换成60秒。
1小时会转换成3600秒。
1星期会转换成7天。
并且 days, seconds, microseconds 会经标准化处理以保证表达方式的唯一性,即:
0 <= microseconds < 1000000
0 <= seconds < 3600*24 (一天的秒数)
-999999999 <= days <= 999999999
具体使用:
print(datetime.datetime.now())
print(datetime.datetime.now() + datetime.timedelta(3)) # 当前时间+3天
print(datetime.datetime.now() + datetime.timedelta(-3)) # 当前时间-3天
print(datetime.datetime.now() + datetime.timedelta(hours=3)) # 当前时间+3小时
print(datetime.datetime.now() + datetime.timedelta(minutes=30)) # 当前时间+30分
print(datetime.datetime.now() + datetime.timedelta(weeks=1)) # 当前时间+7天
加减结果: