文章目录
1. 时间模块 time
1.3.1 最典型的应用:获取时间戳和休眠
1.3.2 考察代码的运行时长
1.3.3 时间戳和struct_time类互转
1.3.4 时间戳和日期时间字符串互转
1.3.5 更多的应用实例
1.1 time.struct_time 类
1.2 模块提供的功能函数
1.3 应用讲解
2. 日期时间模块 datetime
3. 后记
Python 提供了两个标准模块,用于处理时间和日期,一个是 time,一个是 datetime,二者在应用需求上各有侧重。一般而言,time 模块侧重于解决当前的时间日期问题,比如当前日期,当前时间戳等;datetime 模块则侧重于解决时间轴上的问题,比如,107天又7小时28分钟之前是几月几号几时等。
1. 时间模块 time
time模块提供了各种日期、时间功能的类和函数。该模块既提供了把日期、时间格式化为字符串的功能,也提供了从字符串恢复日期、时间的功能。
1.1 time.struct_time 类
在 time 模块内提供了一个 time.struct_time 类,该类代表一个时间对象,它主要包含 9 个属性,每个属性的信息如下所示:
字段名 | 名称 | 备注 |
---|
tm_year | 年 | 例 2019 |
tm_mon | 月 | 1~12 |
tm_mday | 日 | 1~31 |
tm_hour | 时 | 0~23 |
tm_min | 分 | 0~59 |
tm_sec | 秒 | 0~61,应付闰秒和双闰秒 |
tm_wday | 周 | 0~6 |
tm_yday | 一年内第几天 | 1~366 |
tm_isdst | 夏时令 | 0、1 或 -1 |
1.2 模块提供的功能函数
函数名 | 说明 |
---|
time.time() | 返回从 1970-01-01 00:00:00 整到现在过了多少秒。 |
time.asctime([t]) | 将时间元组或 struct_time 转换为时间字符串。如果不指定参数 t,则默认转换当前时间。 |
time.ctime([secs]) | 将时间戳转换为时间字符串。返回值受时区影响。 |
time.gmtime([secs]) | 将时间戳转换为 struct_time 对象。如果不传入参数,则使用当前时间的时间戳(格林尼治时间)。 |
time.localtime([secs]) | 将时间戳转换为struct_time 对象。如果不传入参数,则使用当前时间的时间戳(本地时区时间)。 |
time.mktime(t) | 将 struct_time 对象或元组代表的时间转换为时间戳。 |
time.perf_counter() | 返回性能计数器的值。以秒为单位。 |
time.process_time() | 返回当前进程使用 CPU 的时间,以秒为单位。 |
time.sleep(secs) | 暂停程序(进程或者线程)secs 秒。 |
time.strftime(format[, t]) | 将时间元组或 struct_time 对象格式化为指定格式的时间字符串。如果不指定参数 t,则默认转换当前时间。 |
time.strptime(string[, format]) | 将字符串格式的时间解析成 struct_time 对象。 |
monotonic() | 计时时钟。 |
time.perf_counter() | 计时函数 |
time.timezone | 返回本地时区的时间偏移,以秒为单位。 |
time.tzname | 返回元组(所在标准时间区的名字,夏令时区名字)。 |
time.daylight | 本地时间是否是夏令时间。 |
altzone | 本地夏令时间与格林威治时间(即0时区)时间差 |
1.3 应用讲解
1.3.1 最典型的应用:获取时间戳和休眠
>>> import time>>> time.time() # 返回当前时间的时间戳,也就是自1970年元旦零时至当前时刻的秒数1572515922.4343517>>> time.sleep(1.5) # 休眠1.5秒钟>>> 12345
1.3.2 考察代码的运行时长
>>> import random>>> start = time.time() # 记录启动时间>>> time.sleep(random.random()) # 在[0,1)秒中范围内随机休眠,模拟代码的运行>>> end = time.time() # 记录结束时间>>> print(end - start) # 打印代码的运行时长12345
不过,在IDLE中运行这段代码没有意义,因为显出的时长包含了你逐行输入的时间。写成一个函数,就看的非常清楚了。如果觉得精度不够,还可以将 time.time() 换成 time.perf_counter(),后者精度更高。
>>> def timer():
start = time.time()
time.sleep(random.random())
end = time.time()
print(end-start)>>> timer()0.9216568470001221>>> timer()0.0157682895660400412345678910
1.3.3 时间戳和struct_time类互转
>>> time.localtime() # 将时间戳转换为本地时区的struct_time 类。不提供时间戳,则使用当前时间戳time.struct_time(tm_year=2019, tm_mon=11, tm_mday=9, tm_hour=12, tm_min=19, tm_sec=55, tm_wday=5, tm_yday=313, tm_isdst=0)>>> time.gmtime() # 将时间戳转换为零时区的struct_time 类。不提供时间戳,则使用当前时间戳time.struct_time(tm_year=2019, tm_mon=11, tm_mday=9, tm_hour=4, tm_min=20, tm_sec=9, tm_wday=5, tm_yday=313, tm_isdst=0)>>> time.localtime(0) # 0时间戳,对应我们东八区,就是1970年1月1日8时time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)>>> time.gmtime(0) # 0时间戳,对应格林尼治零时区,就是1970年1月1日0时time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)>>> time.mktime(time.localtime()) # struct_time 类转时间戳1573280478.012345678910
1.3.4 时间戳和日期时间字符串互转
在多年的编程实践中,我始终坚持把日期字符串写成 YYYY-MM-DD 的格式,把日期时间字符串写成 YYYY-MM-DD hh:mm:ss 的格式,不管是使用数据库,还是写代码。这个习惯会降低出现bug的机会。
>>> time.strftime('%Y-%m-%d %H:%M:%S') # 将当前日期时间转成 YYYY-MM-DD hh:mm:ss 的格式'2019-11-09 14:30:28'>>> time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(1573280000)) # 将时间戳转成 YYYY-MM-DD hh:mm:ss 的格式'2019-11-09 14:13:20'>>> time.mktime(time.strptime('2019-10-28 08:00:00', '%Y-%m-%d %H:%M:%S')) # 将时间日期字符串转成时间戳1572220800.0123456
1.3.5 更多的应用实例
>>> time.asctime() # 返回当前时间的时间字符串'Thu Oct 31 17:49:11 2019'>>> time.asctime((2019, 10, 1, 12, 30, 30, 0, 0 ,0)) # 将时间元组转为时间字符串'Mon Oct 1 12:30:30 2019'>>> time.ctime() # 将时间戳转换为时间字符串,默认当前时间的时间戳'Thu Jan 1 08:00:30 1970'>>> time.process_time() # 使用CPU的时长(秒)0.578125>>> start = time.monotonic() # 第一次计时>>> time.sleep(1) # 代码段A>>> end = time.monotonic() # 第二次计时>>> end - start # 代码段A运行的时间>>> start = time.perf_counter() # 第一次计时时间>>> time.sleep(1) # 代码段B>>> end = time.perf_counter() # 第二次计时时间>>> end - start # 代码段B运行的时间>>> time.timezone # 所在时区的时差(秒)-28800123456789101112131415161718
2. 日期时间模块 datetime
datetime 模块提供了可以通过多种方式操作日期和时间的类。在支持日期时间数学运算的同时,实现更有效地解析属性、格式化输出和数据操作。常用的子类有 datetime 类和 timedelta 类。
class datetime.datetime
日期和时间的结合。属性:year, month, day, hour, minute, second, microsecond
class datetime.timedelta
表示两个 date 对象或 time 对象,或者两个 datetime 对象之间的时间间隔,精确到微秒。
2.1 datetime 子类
datetime 对象是一个包含了来自 date 对象和 time 对象所有信息的单一对象。
2.1.1 类方法
now(): 返回当前的本地 datetime
utcnow():返回当前 UTC 日期时间
fromtimestamp(timestamp, tz=None):将时间戳转为 datetime 类型的时间。tz为时区参数
fromisoformat(date_string):将日期字符串转为 datetime 类型的时间。
strptime(date_string, format): 将时间字符串按照 format 格式解析生成 datetime 类型的时间
2.1.2 实例方法
date():返回具有同样 year, month 和 day 值的 date 对象
time():返回具有同样 hour, minute, second, microsecond 和 fold 值的 time 对象
timetuple():返回一个 time.struct_time
toordinal():返回日期的预期格列高利历序号
timestamp():返回时间戳
weekday():返回一个整数代表星期几,星期一为 0,星期天为 6
isoweekday():返回一个整数代表星期几,星期一为 1,星期天为 7
ctime():返回一个代表日期和时间的字符串
strftime(format):返回一个由显式格式字符串所指明的代表日期和时间的字符串
2.1.3 使用样例
>>> from datetime import datetime>>> datetime.strptime('20191010', '%Y%m%d') # 将时间字符串转成datetime类型datetime.datetime(2019, 10, 10, 0, 0)>>> datetime.now() # 当前时间datetime.datetime(2019, 11, 1, 15, 42, 20, 119275)>>> dt = datetime(2019,1,1,0,0,0) # 实例化datetime对象>>> dt
datetime.datetime(2019, 1, 1, 0, 0)>>> dt.date()datetime.date(2019, 1, 1)>>> dt.time()datetime.time(0, 0)>>> dt.replace(2010) # 修改时间datetime.datetime(2010, 1, 1, 0, 0)>>> dt.timetuple() # 返回time.struct_time类time.struct_time(tm_year=2019, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=1, tm_isdst=-1)>>> dt.timestamp() # 时间戳1546272000.0>>> dt.weekday() # 返回一个整数代表星期几,星期一为 0,星期天为 61>>> dt.strftime('%Y-%m-%d %X') # 返回日期时间字符串'2019-01-01 00:00:00'>>> 1234567891011121314151617181920212223
2.2 timedelta类
timedelta 类用来描述一段时间,你可以把它理解成成两个日期或时间点之间的时间间隔。timedelta 对象之间,以及 timedelta 对象和 datetime 对象之间,可以做加减运算。
2.2.1 参数
要想创建一个 datetime.timedelta 类,你需要将指定的时间段传递给类的构造函数。可选参数包含:
weeks: 周数
days: 天数(默认)
hours: 小时数
minutes: 分钟数
seconds: 秒数
microseconds: 微妙数
2.2.2 使用样例
>>> from datetime import datetime, timedelta>>> timedelta(days=3) # 3天的时间段datetime.timedelta(days=3)>>> timedelta(days=3, hours=2.5) # 3天加上2.5小时的时间段datetime.timedelta(days=3, seconds=9000)>>> now = datetime.now() # 当前时间>>> now
datetime.datetime(2019, 11, 9, 15, 24, 13, 679425)>>> delta = timedelta(days=3, hours=2, minutes=15) # 3天加上2小时15分钟的时间段>>> now - delta # 3天又2小时15分钟之前的日期时间datetime.datetime(2019, 11, 6, 13, 9, 13, 679425)1234567891011
2.2.3 应用讲解
2.2.3.1 今年五一节零时之前1376天零7小时是几月几号几时?
>>> from datetime import datetime, timedelta>>> dt = datetime(2019,5,1,0,0,0)>>> delta = timedelta(days=1376, hours=7)>>> dt - delta
datetime.datetime(2015, 7, 24, 17, 0) # 答案是2015年7月24日17时12345
2.2.3.2 当前时刻距离新年有多少秒钟?
>>> from datetime import datetime, timedelta>>> now = datetime.now() # 当前时刻>>> new_year = datetime(now.year+1, 1, 1, 0, 0, 0) # 下一个元旦的零时>>> delta = new_year - now # 计算时间间隔>>> delta.total_seconds() # 获取时间间隔的总秒数4523121.717534
未经允许不得转载:编程自学网 » Python新手入门必学十大模块之二:time 和 datetime