time datetime

本文介绍Python中使用time和datetime库处理时间的方法,包括获取当前时间、日期和时间戳,以及如何进行时间加减运算。特别关注如何根据业务需求确定用户的登录日期。

timedatetime是python处理时间的两个库,作用差不多
据说datetime的功能比time完善,为了保持一致,尽量都用datetime
所以time在我看来唯一的用处就是获取时间戳了

注意datetime里面还有个模块叫datetime,很恶心人,导入的时候小心点

import datetime

当前时间(精确到秒)

t = datetime.datetime.now()  # 2017-12-12 19:10:19.580580

当前日期(精确到天)

t = datetime.date.today()  # 2017-12-12

当前时间戳
datetime好像不能直接得到时间戳,所以先拿到当前时间,再转成时间戳

t = datetime.datetime.now()
stamp = t.timestamp()  # 1513077019.58058

或者通过time直接获取时间戳

import time

t = time.time()  # 1513077019.580655

应用

因为工作上的需要,要拿到一个日期(天)的第二天早上六点的时间,我是这么做的

先拿到零点的时间

t = datetime.date.today()  # 2017-12-12
t = datetime.datetime.strftime(t, "%Y-%M-%d %H:%M:%S")  # 2017-12-12 00:00:00

上面拿到的是字符串,需要转成datetime类型才能进行时间上的加减和比较

t = datetime.datetime.strptime(t, "%Y-%m-%d %H:%M:%S")  # 2017-12-12 00:00:00

加六个小时,也可以加daysminutesweeks等等

t = t + datetime.timedelta(hours=6)  # 2017-12-12 06:00:00

这样就拿到我想要的东西了,干什么用呢
第一个日期是用户已经登录过的日期,算出这个日期第二天早上六点的时间
只要用户在那个时间之前登录,都算已经登录过了,不做处理
在那个时间之后的第一次登录,就算新的一天的登录,做处理,并重置登录日期为今天

注意datetime类型的时间,是可以直接做比较的

t1 = 2017-12-12 19:00:00
t2 = 2017-12-12 20:00:00
t1 < t2  # True

在重置登录日期的时候,又遇到一个问题
如果在零点到六点之间重置,因为过了零点,日期算第二天了
但过了六点之后应该还要重置一次,判断条件已经达不到了

所以再做一个判断,是在零点和六点之间重置,日期就往回退一天

t = datetime.datetime.now()
h = t.hour
if h > 6:
    t = datetime.date.today()
else:
    t = datetime.date.today() - datetime.timedelta(days=1)

参考

网上的资料一片混乱,这篇是我看过写得最清楚的
https://zhuanlan.zhihu.com/p/23679915

这篇讲了timedatetime的区别与联系
http://gracece.com/2014/10/the-distinction-between-date-and-datetime-in-python/

再收藏一篇
http://www.wklken.me/posts/2015/03/03/python-base-datetime.html#1-huo-qu-dang-qian-datetime

转载于:https://www.cnblogs.com/xb21/p/8385992.html

### 时间对象与时间差对象的运算限制 在 Python 的 `datetime` 模块中,`time` 对象表示一天中的某个时刻(不包含日期信息),而 `timedelta` 表示两个时间点之间的差异。由于 `time` 类型仅表示时间而不包含日期,因此不能直接与 `timedelta` 进行加减操作。尝试对 `datetime.time` 和 `datetime.timedelta` 执行减法会引发 `TypeError` 或 `AttributeError`,因为 `time` 类型没有用于处理时间偏移的方法或属性[^4]。 如果需要执行类似的时间偏移计算,例如“当前时间减去 30 分钟”,则应使用包含完整日期和时间信息的 `datetime.datetime` 对象进行操作: ```python from datetime import datetime, timedelta now = datetime.now() thirty_minutes_ago = now - timedelta(minutes=30) print("当前时间:", now.strftime("%Y-%m-%d %H:%M:%S")) print("30分钟前的时间:", thirty_minutes_ago.strftime("%Y-%m-%d %H:%M:%S")) ``` 若仅需处理某一天的具体时刻并调整该时刻,则可以将 `datetime.datetime` 构造为当天的特定时间,再执行减法操作: ```python from datetime import datetime, timedelta # 假设时间为今天下午 15:30 base_time = datetime.combine(datetime.today(), datetime.strptime("15:30", "%H:%M").time()) adjusted_time = base_time - timedelta(minutes=45) print("原始时间:", base_time.strftime("%Y-%m-%d %H:%M:%S")) print("调整后时间:", adjusted_time.strftime("%Y-%m-%d %H:%M:%S")) ``` 对于更复杂的时间运算,如涉及月份、年份变化的场景,`datetime.timedelta` 不支持这些单位。此时可借助第三方模块 `dateutil.relativedelta` 来实现更灵活的操作: ```python from datetime import datetime from dateutil.relativedelta import relativedelta now = datetime.now() one_month_later = now + relativedelta(months=1) print("当前时间:", now.strftime("%Y-%m-%d %H:%M:%S")) print("一个月后的时间:", one_month_later.strftime("%Y-%m-%d %H:%M:%S")) ``` 这种做法弥补了 `datetime` 模块在处理较大时间单位时的不足,并保持代码的清晰性与可读性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值