【问题标题】:finding first day of the month in python在python中查找每月的第一天
【发布时间】:2022-01-04 13:19:30
【问题描述】:

我试图在 python 中找到当月的第一天,条件是:如果我当前的日期已经过了当月的 25 号,那么第一个日期变量将保存下个月的第一个日期而不是当前日期月。我正在执行以下操作:

import datetime 
todayDate = datetime.date.today()
if (todayDate - todayDate.replace(day=1)).days > 25:
    x= todayDate + datetime.timedelta(30)
    x.replace(day=1)
    print x
else:
    print todayDate.replace(day=1)

有没有更简洁的方法来做到这一点?

【问题讨论】:

  • 顺便说一句,您的测试todayDate - todayDate.replace(day=1)).days > 25 仅在 27 日变为真,而不是 26 日。你是想照你说的做,还是照做代码?
  • 在我看来,您可能会在 2 月下旬遇到问题。

标签: python datetime


【解决方案1】:

可以在同一行使用date.replace:

from datetime import datetime

datetime.today().replace(day=1)

【讨论】:

  • 这实际上并不能解决发布的问题。请注意约束“如果我当前的日期超过了当月的 25 日,那么第一个日期变量将保存下个月的第一个日期”
  • 但它确实解决了人们通过搜索引擎来到这里的问题:)
  • 这里也是上个月的第一天print( ((datetime.datetime.today().replace(day=1)) - datetime.timedelta(days=30)).strftime('%Y-%m-%d') )
  • @ffghfgh 不要认为这将永远有效.. 如果“今天”是 3 月 1 日,回溯 30 天会在 1 月的 2 月过去。
【解决方案2】:

这是一个简洁的解决方案。

import datetime 

todayDate = datetime.date.today()
if todayDate.day > 25:
    todayDate += datetime.timedelta(7)
print todayDate.replace(day=1)

在原始代码示例中需要注意的一点是,如果您在 1 月的最后一天进行测试,使用 timedelta(30)会引起麻烦e。这就是我使用 7 天增量的原因。

【讨论】:

  • 你是对的@J.F.Sebastian!那更简洁,所以我做了你建议的改变。
【解决方案3】:

使用dateutil

from datetime import date
from dateutil.relativedelta import relativedelta

today = date.today()
first_day = today.replace(day=1)
if today.day > 25:
    print(first_day + relativedelta(months=1))
else:
    print(first_day)

【讨论】:

  • 你的回答也有如何找到最后一天,非常感谢
【解决方案4】:
from datetime import datetime

date_today = datetime.now()
month_first_day = date_today.replace(day=1, hour=0, minute=0, second=0, microsecond=0)
print(month_first_day)

【讨论】:

  • 这是一个很好的获取当月第一天时间戳的解决方案,以防您需要查询当前月份左右。
【解决方案5】:

使用arrow

import arrow
arrow.utcnow().span('month')[0]

【讨论】:

    【解决方案6】:

    这可以替代 Gustavo Eduardo Belduma 的回答:

    import datetime 
    first_day_of_the_month = datetime.date.today().replace(day=1)
    

    【讨论】:

    • 我不想在他的回答中编辑任何内容,因为我没有检查他的解决方案是否正确,这只是一个替代方案。
    【解决方案7】:

    是的,首先将日期时间设置为当月的开始。

    第二次测试当前日期是否 > 25 并获得真/假。如果为 True,则在月​​初日期时间对象中添加一个月。如果为 false,则使用值设置为月初的日期时间对象。

    import datetime 
    from dateutil.relativedelta import relativedelta
    
    todayDate = datetime.date.today()
    resultDate = todayDate.replace(day=1)
    
    if ((todayDate - resultDate).days > 25):
        resultDate = resultDate + relativedelta(months=1)
    
    print resultDate
    

    【讨论】:

      【解决方案8】:

      箭头模块将引导您避开细微的错误,并且更容易使用旧产品。

      import arrow
      
      def cleanWay(oneDate):
          if currentDate.date().day > 25:
              return currentDate.replace(months=+1,day=1)
          else:
              return currentDate.replace(day=1)
      
      
      currentDate = arrow.get('25-Feb-2017', 'DD-MMM-YYYY')
      print (currentDate.format('DD-MMM-YYYY'), cleanWay(currentDate).format('DD-MMM-YYYY'))
      
      currentDate = arrow.get('28-Feb-2017', 'DD-MMM-YYYY')
      print (currentDate.format('DD-MMM-YYYY'), cleanWay(currentDate).format('DD-MMM-YYYY'))
      

      在这种情况下,例如,您无需考虑月份的不同长度。这是此脚本的输出。

      25-Feb-2017 01-Feb-2017
      28-Feb-2017 01-Mar-2017
      

      【讨论】:

      • 最好使用 Arrow.shift currentDate.shift(months=+1).replace(day=1) 代替 replace 以避免过去几天。
      【解决方案9】:

      你可以使用dateutil.rrule:

      In [1]: from dateutil.rrule import *
      
      In [2]: rrule(DAILY, bymonthday=1)[0].date()
      Out[2]: datetime.date(2018, 10, 1)
      
      In [3]: rrule(DAILY, bymonthday=1)[1].date()
      Out[3]: datetime.date(2018, 11, 1)
      

      【讨论】:

        【解决方案10】:

        我找到当月第一天和最后一天的解决方案:

        def find_current_month_last_day(today: datetime) -> datetime:
            if today.month == 2:
                return today.replace(day=28)
        
            if today.month in [4, 6, 9, 11]:
                return today.replace(day=30)
        
            return today.replace(day=31)
        
        
        def current_month_first_and_last_days() -> tuple:
            today = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
            first_date = today.replace(day=1)
            last_date = find_current_month_last_day(today)
            return first_date, last_date
        

        【讨论】:

          【解决方案11】:

          下个月的第一天:

          from datetime import datetime

          class SomeClassName(models.Model):
              if datetime.now().month == 12:
                  new_start_month = 1
              else:
                  new_start_month = datetime.now().month + 1
          

          然后我们替换月份和日期

              start_date = models.DateField(default=datetime.today().replace(month=new_start_month, day=1, hour=0, minute=0, second=0, microsecond=0))
          

          【讨论】:

            【解决方案12】:

            我发现一个干净的方法是使用 todayDate 的月份和年份属性创建一个日期时间对象,将天数设置为 1,即

            import datetime 
            todayDate = datetime.date.today()
            
            firstOfMon = datetime.date(todayDate.year, todayDate.month, 1)
            

            【讨论】:

              【解决方案13】:

              单线:

              from datetime import datetime, timedelta
              last_month=(datetime.now().replace(day=1) - timedelta(days=1)).replace(day=1)
              

              【讨论】:

                猜你喜欢
                • 2017-11-17
                • 1970-01-01
                • 2020-10-02
                • 2010-10-10
                • 1970-01-01
                • 2023-03-18
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多