You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算datetime.datetime.utcnow()与一周起始时间的差值并处理特殊场景?

问题:获取UTC时间与一周起始时间(时分秒置0)的差值

需求是计算datetime.datetime.utcnow()与一周起始时间的时间差,其中一周起始时间需要将时分秒置为0。举例来说,若当前时间为「date=17,month=12,year=2022,hour=x,minute=y,second=z」,对应的一周起始时间应为「date=12,month=12,year=2022,hour=0,minute=0,second=0」。

用户尝试了以下代码:

from datetime import datetime as dt,
    timezone as tz,
    timedelta as td
print(dt.isoformat(dt.utcnow()-td(days=dt.weekday(dt.now(tz.utc)))))

但这段代码输出的起始时间时分秒未置零,不符合预期。需要实现能覆盖以下特殊场景的最优方案:

  • 包含闰年2月29日的时间范围
  • 当前日期的星期几属于上月的情况
  • 其他跨月/跨年的特殊场景

解决方案

核心思路是先将当前UTC时间的时分秒置0,再推算一周起始时间,而非直接对带时分秒的时间做减法,这样能确保起始时间的时分秒为0,同时datetime的timedelta会自动处理跨月、跨年、闰年等特殊情况。

完整代码实现:

from datetime import datetime as dt, timedelta as td

# 获取当前UTC时间
now_utc = dt.utcnow()
# 将当前时间的时分秒、微秒置0,得到当天0点的UTC时间
today_midnight = now_utc.replace(hour=0, minute=0, second=0, microsecond=0)
# 计算需要往前推的天数:weekday()返回0=周一,6=周日,周一减0天,周日减6天
days_to_subtract = today_midnight.weekday()
# 得到一周起始时间(周一0点UTC)
week_start = today_midnight - td(days=days_to_subtract)
# 计算时间差
time_delta = now_utc - week_start

# 输出结果示例
print(f"当前UTC时间: {now_utc.isoformat()}")
print(f"一周起始时间: {week_start.isoformat()}")
print(f"时间差: {time_delta}")

特殊场景验证

  1. 闰年2月29日场景:若当前UTC时间为2020-02-29 14:30:00,today_midnight为2020-02-29 00:00:00,其weekday()为6(周六),往前推6天得到2020-02-23 00:00:00,正确。
  2. 跨月场景:若当前UTC时间为2023-01-01 08:00:00,today_midnight为2023-01-01 00:00:00,其weekday()为6(周日),往前推6天得到2022-12-26 00:00:00,自动处理跨月,正确。
  3. 跨年场景:若当前UTC时间为2024-01-02 10:00:00,today_midnight为2024-01-02 00:00:00,其weekday()为1(周二),往前推1天得到2024-01-01 00:00:00,正确。

内容的提问来源于stack exchange,提问作者redoc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 13:10:24