首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在考虑到日历月中的不平等日的情况下,增加/扣除月份

在考虑到日历月中的不平等日的情况下,增加/扣除月份
EN

Stack Overflow用户
提问于 2021-08-22 12:06:24
回答 1查看 177关注 0票数 1

我正试图想出一种方法来创建一个日期列表--从给定的日期ndt几个月前。然而,基于什么是dt,这似乎很棘手。下面我通过几个例子来说明这个困境(尤指)。请看下面棘手的案例--3):

代码语言:javascript
复制
from datetime import datetime
from dateutil.relativedelta import relativedelta
# Simple case.
dt = datetime(2021, 2, 15)
dt - relativedelta(months=1)  # n=1 gives datetime.datetime(2021, 1, 15, 0, 0)
dt - relativedelta(months=2)  # n=2 gives datetime.datetime(2020, 12, 15, 0, 0)
# Simple case-2
dt = datetime(2021, 3, 31)
dt - relativedelta(months=1)  # n=1 gives datetime.datetime(2021, 2, 28, 0, 0)
dt - relativedelta(months=2)  # n=2 gives datetime.datetime(2021, 1, 31, 0, 0)
dt - relativedelta(months=3)  # n=3 gives datetime.datetime(2020, 12, 31, 0, 0)
dt - relativedelta(months=4)  # n=4 gives datetime.datetime(2020, 11, 30, 0, 0)
# Tricky case-3
dt = datetime(2021, 2, 28)
dt - relativedelta(months=1)  # n=1 gives datetime.datetime(2021, 1, 28, 0, 0) and not datetime.datetime(2021, 1, 31, 0, 0)
dt - relativedelta(months=2)  # n=2 gives datetime.datetime(2020, 12, 28, 0, 0) and not datetime.datetime(2020, 12, 31, 0, 0)
dt - relativedelta(months=3)  # n=3 gives datetime.datetime(2020, 11, 28, 0, 0) and not datetime.datetime(2020, 11, 30, 0, 0)
dt - relativedelta(months=4)  # n=4 gives datetime.datetime(2020, 10, 28, 0, 0) and not datetime.datetime(2020, 10, 31, 0, 0)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-22 14:32:11

相对人塔似乎在月底的情况下失败了,而月有不到31天的时间。这里有个解决办法:

  • 检查日期是否为月底
  • 如果没有,只需使用relativedelta
  • 如果是这样的话,请使用相对论month,但是通过显式地设置day属性来确保日期是月中的最后一天。
代码语言:javascript
复制
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta

# add_month adds n months to datetime object dt
def add_month(dt, n):
    # we can add a day without month changing - not end of month:
    if (dt + timedelta(1)).month == dt.month:
        return dt + relativedelta(months=n)
    # implicit else: end of month
    return (dt + relativedelta(months=n+1)).replace(day=1) - timedelta(1)

示例:

代码语言:javascript
复制
d = datetime(2021, 3, 15)
print(add_month(d, -1).date(), d.date(), add_month(d, 1).date())
# 2021-02-15 2021-03-15 2021-04-15

d = datetime(2021, 3, 31)
print(add_month(d, -1).date(), d.date(), add_month(d, 1).date())
# 2021-02-28 2021-03-31 2021-04-30

d = datetime(2021,2,28)
print(add_month(d, -1).date(), d.date(), add_month(d, 1).date())
# 2021-01-31 2021-02-28 2021-03-31

d = datetime(2021,11,30)
print(add_month(d, -1).date(), d.date(), add_month(d, 1).date())
# 2021-10-31 2021-11-30 2021-12-31
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68881153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档