文章目录
Python datetime
一、引入 datetime 模块
Python 的 datetime
模块是常用的日期处理模块,模块中的 datetime
类即为我们常用的日期对象,两者名称是完全相同,初次使用时可能会弄混,我们常说的 datetime
其实是对应模块中的 datetime
类。
而 datetime
模块中实际上包括了若干描述时间的类,如下:
time
date
timedelta
tzinfo
timezone
datetime
所以常用的方法可以是实例化上面的类,或者是使用类中的方法:
# 引入 datetime 模块
import datetime
# datetime模块的变量
max_year = datetime.MAXYEAR # 9999
# 用法一
# 使用 datetime类 的方法
today = datetime.datetime.today() # 这个方法在类中而不是外层模块中
# 用法二
# 实例化 datetime 对象,年月日必填
d = datetime.datetime(2024, 6, 1) # 两个 datetime !! 第一个是模块,第二个是模块里面同名的类
二、创建,修改
python 日期对象,可以设置 [year, month, day, hour, minute, second, microsecond]
到毫秒的时间:
import datetime
# 指定参数,例如哪一年,哪一个月份,什么时间都可以
# 必须指定 year, month, day
d = datetime.datetime(2021, 10, 10, 0, 0, 0)
# 当前时间
today = datetime.datetime.today()
另外,也可以对已经生成的对象进行修改,设置所需的时间,可以通过 replace
方法修改已经创建的时间:
d = datetime.datetime(2024, 10, 10, 0, 0, 0)
d.replace(year=2020)
# output
# 2020, 10, 10, 0, 0, 0
replace
可以设置的日期单位还包括:
day
month
second
microsecond
可以直接访问日期对象的各个日期单位:
d = datetime.datetime(2024, 10, 10, 0, 0, 0)
print(d.year) # 2024
print(d.month) # 10
print(d.day) # 10
三、转换
当你需要对日期进行运算的时候,datetime
提供了时间加减的计算方法,此时将输入的日期字符串转换为 datetime
对象将更加方便;而当你需要传输,写入,或者是打印日期的时候,datetime
也提供了输出格式化字符串的方法。
这就涉及到日期对象(datetime
) 和日期字符串(str
)之间的相互转换。
1. datetime.datetime.strftime(format) 日期对象转换为指定格式化的字符串
可以通过 datetime
对象的 strftime
方法将其格式化输出成为对应的字符串:
import datetime
dt = datetime.datetime(2021, 1, 1, 0, 0, 0)
# 时间格式化的通配符很多,基本完全通用,但也有一些语言支持的通配符集合有
# 差异,例如 MySQL 里面还有 %i 表示 00-59 的时间格式,注意不要混淆
# 常用
# %Y 四位年份 0000-2024
# %y 两位年份 00-99
# %m 月份 01-12
# %d 日期 01-31
# %H 小时 01-24
# %I 12小时制 01-12
# %M 分钟 01-59
# %S 秒钟 01-59
# %w 周 0-6
# %a 周英文 Sat
# %A 周英文全称 Saturday
# %j 今年的第几天 001-366
# %U 今年以周一开始的第几周 00-53
datetimeStr = dt.strftime('%Y-%m-%d %H:%M:%S')
print(datetimeStr)
# output
# '2021-01-01 00:00:00'
2. datetime.datetime.strptime(str, format) 日期字符串转换为日期对象
可以通过 datetime
类的 strptime
函数,将字符串根据指定格式转换为对应的日期对象:
# 注意还是两个datetime,这里是 datetime 类的方法
dt = datetime.datetime.strptime('2021-09-01 10:53:13', '%Y-%m-%d')
#
# 报错!天,时分秒未转换
dt = datetime.datetime.strptime('2021-09-01 10:53:13', '%Y-%m-%d %H:%M:%S')
# 正常转换
# 2021, 9, 1, 10, 53, 13
3. datetime.datetime.fromtimestamp(ts) 时间戳转日期
将时间戳转换为字符串:
datetime.datetime.fromtimestamp(ts) # ts 为整数类型的时间戳
得到的日期为距离 1970-01-01 08:00:00
的 ts
秒后的日期,所以如果 ts=0
,则结果为 datetime.datetime(1970, 1, 1, 8, 0)
。
4. datetime.datetime.timestamp() 日期对象转时间戳
转换的时间戳为该日期距离 1970-01-01 08:00:00
的秒数:
import datetime
# 当前时间戳,float 类型
datetime.datetime.today().timestamp()
# 等价于
(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()
四、运算
日期的运算通过 datetime.datetime
日期对象和 timedelta
日期增量 之间的加减运算得到新的日期结果,通过引入 timedelta
进行使用,可以包括最大到一周的 week
的增量单位:
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
而在这些单位中,实际上只有 days
,seoncds
,microseconds
是存储的对应单位的值,而其他单位都会转化为上面三个单位中向下最近的单位表示,例如:
# 一天的时间单位量
day_delta = datetime.timedelta(days=1) # 实际即为 days=1
# 一周
week_delta = datetime.timedelta(weeks=1)
# 转化为 timedelta(days=7)
# 一小时
hour_delta = datetime.timedelta(hours=1)
# 转化为 timedelta(seconds=3600)
# 一分钟
min_delta = datetime.timedelta(minutes=1)
# 转化为 timedelta(seconds=60)
datetime
对象可以与 timedelta
对象进行加减运算,从而实现日期运算:
import datetime
# 当前时间
today = datetime.datetime.today()
# 昨天
yesterday = today - datetime.timedelta(days=1)
# 明天
tomorrow = today + datetime.timedelta(days=1)
# 去年年份
last_year = (today.replace(day=1) - datetime.timedelta(days=1)).year