【问题标题】:How to get a specific date from the previous month given the current date in python?给定python中的当前日期,如何从上个月获取特定日期?
【发布时间】:2019-09-13 04:45:12
【问题描述】:

鉴于current_date(),我想获得上个月的 20 日 我正在尝试使用 time.strftime 但无法从中减去该值。

timestr = time.strftime("%Y-(%m-1)%d")

这给了我错误。如果我的 current_date 是在四月,那么预期的输出是 2019-03-20。不知道该怎么做。

我阅读了 SO 的帖子,其中大多数都提到了当月的第一天/最后一天。任何帮助将不胜感激。

【问题讨论】:

  • 所以..如果你能得到给定月份的第一天,减去一个月,然后加上 19 天。我还建议使用datetime,因为它有更多适用的属性/方法

标签: python python-3.x


【解决方案1】:
from datetime import date, timedelta
today = date.today()
last_day_prev_month = today - timedelta(days=today.day)
twenty_prev_month = last_day_prev_month.replace(day=20)
print(twenty_prev_month)  # 2019-03-20

【讨论】:

    【解决方案2】:

    使用datetime.replace

    import datetime
    
    current_date = datetime.date.today()
    new_date = current_date.replace(
      month = current_date.month - 1,
      day = 20
    )
    
    print(new_date)
    #2019-03-20
    

    编辑

    这对 Jan 不起作用,所以这是一种解决方法:

    import datetime
    
    current_date = datetime.date(2019, 2, 17)
    month = current_date.month - 1
    year = current_date.year
    if not month:
      month, year = 12, year - 1
    
    new_date = datetime.date(year=year, month=month, day=20)
    

    【讨论】:

    • 我认为这不适用于一月份,例如:current_date = datetime.datetime(2019, 1, 17)
    【解决方案3】:

    我想这是解析日期的方式。据我了解,它正在寻找您的代码

    2019-(03-1)202019-(12-1)15等。

    因为 %y 不是变量,而是关于如何在文本字符串中预期日期的消息,而其他字符是预期的,但未处理(如“-”)

    这似乎完全不是你想要的。我会像往常一样解析日期,然后将其重新格式化为一个月前:

    import datetime
    time = datetime.datetime.today()
    print(time)
    timestr = time.strftime("%Y-%m-%d")
    year, month, day = timestr.split("-")
    print("{}-{}-{}".format(year, int(month)-1, day))
    

    使用timedelta 对象会更容易,但遗憾的是几个月都没有,因为它们的长度不同。

    如果涉及到新的一年,则更加稳健:

    import datetime
    time = datetime.datetime.today()
    print(time)
    timestr = time.strftime("%Y-%m-%d")
    year, month, day = timestr.split("-")
    if month in [1, "01", "1"]: # I don't remember how January is represented
        print("{}-{}-{}".format(int(year) - 1, 12, day)) # use December of last year
    else:
        print("{}-{}-{}".format(year, int(month)-1, day))
    

    【讨论】:

      【解决方案4】:

      这会有所帮助:

      from datetime import date, timedelta
      
      dt = date.today() - timedelta(30)// timedelta(days No.)
      print('Current Date :',date.today())
      print(dt)
      

      【讨论】:

      • 什么是days No.?这不是有效的语法,您也根本没有尝试解释它...
      • 如果日期落在 2 月会怎样?
      • @Reedinationer Days Number 表示您要减去多少天......比如说 30 或 31。
      【解决方案5】:

      不可能在传递给 time.strftime 的字符串中进行数学运算,但您可以使用 time 模块轻松完成与您所要求的类似的事情

      在 Python 3 中

      # Last month
      t = time.gmtime()
      print(f"{t.tm_year}-{t.tm_mon-1}-20")
      

      或在 Python 2 中

      print("{0}-{1}-{2}".format(t.tm_year, t.tm_mon -1, 20))
      

      如果您的约束较少,您可以只使用datetime 模块。

      【讨论】:

        【解决方案6】:

        您可以使用datetimedateutilarrow 查找上个月的第20 天。请参阅下面的示例。


        使用datetime

        from datetime import date
        
        d = date.today()
        
        month, year = (d.month-1, d.year) if d.month != 1 else (12, d.year-1)
        
        last_month = d.replace(day=20, month=month, year=year)
        
        print(last_month)
        

        使用datetimetimedelta

        from datetime import date
        from datetime import timedelta
        
        d = date.today()
        
        last_month = (d - timedelta(days=d.day)).replace(day=20)
        
        print(last_month)
        

        使用datetimedateutil

        from datetime import date
        from dateutil.relativedelta import relativedelta  # pip install python-dateutil
        
        d = date.today()
        
        last_month = d.replace(day=20) - relativedelta(months=1)
        
        print(last_month)
        

        使用arrow

        import arrow  # pip install arrow
        
        d = arrow.now()
        
        last_month = d.shift(months=-1).replace(day=20).datetime.date()
        
        print(last_month)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多