外观
time 和 datetime
首先我们需要了解一个前置概念:UNIX时间,或称POSIX时间,是UNIX或类UNIX系统使用的时间表示方式:从UTC1970年1月1日0时0分0秒起至现在的总秒数,不考虑闰秒。
提示
上方段落超链接为维基百科,在国内无法正常访问。
下面我们将介绍编程中常用的 time
和 datetime
库的简单使用。除此之外,Python 还有一个与时间处理相关的库 calendar
,有兴趣的同学可以自行去了解。
time API简述
time
是 Python 内置的时间处理库,比 datetime
更强大,但封装的功能更少。
运行代码
import time
print(time.time()) # 返回当前UNIX时间戳,输出:1659750029.9468005
print(time.ctime()) # 返回一个简单的可读的字符串,输出:Sat Aug 6 09:37:14 2022
print(time.localtime()) # 返回当前时间的时间元组,可传递一个时间戳作为参数,输出:time.struct_time(tm_year=2022, tm_mon=8, tm_mday=6, tm_hour=9, tm_min=40, tm_sec=29, tm_wday=5, tm_yday=218, tm_isdst=0)
print(time.strftime('%Y-%m-%d %b %a %H:%M:%S %p %z', time.localtime())) # 格式化时间,可自行删减字符串中的格式字符,若要格式化当前时间time.localtime()可不传,输出:2022-08-06 Aug Sat 09:40:29 AM +0800
print(time.strptime('Sat Aug 6 09:37:14 2022', '%a %b %d %H:%M:%S %Y')) # 将字符串转换为时间元组,可自行删减字符串中的格式字符,输出:time.struct_time(tm_year=2022, tm_mon=8, tm_mday=6, tm_hour=9, tm_min=37, tm_sec=14, tm_wday=5, tm_yday=218, tm_isdst=-1)
print(time.timezone) # 返回UTC时间与当前时区时间的差,输出(计算机时区为北京时间):-28800
# time.sleep(10)
# time 库最常用的函数:使程序暂停10秒后继续执行下面的代码
# 为了让大家能正常在线运行上面的代码,先注释掉这一行
datetime API 简述
datetime
是一个处理日期和时间更优雅的 Python 内置库,主要的功能由 datetime.date
datetime.time
datetime.datetime
(表示时间)和 datetime.timedelta
(表示时间差)四个类来完成(有什么区别翻译一下就知道了),我们在这里介绍 datetime
和 timedelta
类。
要进行网站开发和数据库操作的同学极力建议你认真阅读 **datetime**
的相关内容,因为数据库中存储日期时间的数据类型在 Python 中通常都使用 datetime
来操作。
创建 datetime
对象
运行代码
from datetime import datetime as dt
a = dt(2022, 8, 6)
print(a) # 根据年、月、日生成,输出:2022-08-06 00:00:00
b = dt(2022, 8, 6, 12, 30, 45)
print(b) # 根据年、月、日、时、分、秒生成,输出:2022-08-06 12:30:45
print(dt.now()) # 根据当前时间生成,输出:2022-08-06 10:03:48.041209
print(dt.utcnow()) # 根据当前UTC时间生成,输出:2022-08-06 02:03:48.041209
print(dt.fromtimestamp(1587800)) # 根据时间戳生成,输出:1970-01-19 17:03:20
print(dt.fromisoformat('2022-08-02T20:02:29.694178+08:00')) # 根据ISO格式生成(真实数据处理中常用),输出:2022-08-02 20:02:29.694178+08:00
从 datetime
对象取值
运行代码
from datetime import datetime as dt
a = dt.now()
# 年 月 日 时 分 秒 微秒(最大为1e6)
print(a.year, a.month, a.day, a.hour, a.minute, a.second, a.microsecond) # 2022 8 6 10 10 28 325685
print(a.timestamp()) # 转换为时间戳,输出:1659751929.325685
print(a.strftime('%Y-%m-%d %H:%M:%S')) # 格式化为字符串,使用与上文介绍的 time 相同,输出:2022-08-06 10:14:00
print(a.isoformat()) # 转换为ISO格式,输出:2022-08-06T10:15:01.220633
# 为 datetime 对象 a 添加时区,再取值
a = a.astimezone()
print(a.isoformat()) # 输出:2022-08-06T10:15:01.220633+08:00
datedelta
对象的创建和使用
运行代码
# 由 datetime 对象相减得到
from datetime import datetime as dt
a = dt(2018, 7, 2, 12, 30)
b = dt.now()
print(b - a) # 1495 days, 21:49:14.772614
# 由 timedelta 创建
from datetime import timedelta as td
# 可传参数:days, seconds, microseconds, milliseconds, minutes, hours, weeks
# 可传递多个进行叠加
c = td(days=1, hours=25)
print(c) # 2 days, 1 hours
# 对日期进行加减操作
d = dt(2022, 8, 6, 10, 20)
print(d) # 2022-08-06 10:20:00
print(d + td(days=1, hours=2)) # 2022-08-07 12:20:00
实例
计算代码执行所用时长
运行代码
import time
def a():
time.sleep(3)
t1 = time.time()
a()
t2 = time.time()
print(t2 - t1) # 输出:3.00197172164917
实际输出会超出5秒,是因为函数调用、变量计算等均会消耗时间。
对于网站开发的建议
网站开发中,服务器、开发者、客户处于不同的时区是一件令人头疼的事情。使用 Django 框架进行开发时,其内置的数据库引擎可以优雅地处理好时区问题;而 Flask 等使用 SQLAlchemy 引擎的开发框架并没有内置的时区处理,我的建议是直接存储 datetime.datetime.utcnow
而非 datetime.datetime.now
。
版权所有
版权归属:异想之旅