编程自学网编程自学网编程自学网

Python新手入门必学十大模块之二:time 和 datetime

文章目录

  • 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


    • 2.2.1 参数

    • 2.2.2 使用样例

    • 2.2.3 应用讲解


    • 2.2.3.1 今年五一节零时之前1376天零7小时是几月几号几时?

    • 2.2.3.2 当前时刻距离新年有多少秒钟?

    • 2.1.1 类方法

    • 2.1.2 实例方法

    • 2.1.3 使用样例

    • 2.1 datetime 子类


    • 2.2 timedelta类


  • 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_mon1~12
tm_mday1~31
tm_hour0~23
tm_min0~59
tm_sec0~61,应付闰秒和双闰秒
tm_wday0~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