我试图用python获取前一个月的日期。 以下是我的尝试:

str( time.strftime('%Y') ) + str( int(time.strftime('%m'))-1 )

然而,这种方式有两个原因:首先,它将返回2012年2月的20122(而不是201202);其次,它将返回0而不是1月的12。

我一下子就解决了这个麻烦

echo $(date -d"3 month ago" "+%G%m%d")

我认为,如果bash有一种内置的方式来实现这一目的,那么python应该提供更好的东西,而不是强迫自己编写脚本来实现这一目标。当然我可以这样做:

if int(time.strftime('%m')) == 1:
    return '12'
else:
    if int(time.strftime('%m')) < 10:
        return '0'+str(time.strftime('%m')-1)
    else:
        return str(time.strftime('%m') -1)

我还没有测试这段代码,我不想使用它(除非我找不到任何其他方法:/)

谢谢你的帮助!


当前回答

基于@ j.f.的评论。Sebastian,您可以将replace()函数链接到一个“月”之前。因为一个月不是一个固定的时间段,所以这个解决方案尝试返回到前一个月的同一日期,当然这并不适用于所有月份。在这种情况下,该算法默认为前一个月的最后一天。

from datetime import datetime, timedelta

d = datetime(2012, 3, 31) # A problem date as an example

# last day of last month
one_month_ago = (d.replace(day=1) - timedelta(days=1))
try:
    # try to go back to same day last month
    one_month_ago = one_month_ago.replace(day=d.day)
except ValueError:
    pass
print("one_month_ago: {0}".format(one_month_ago))

输出:

one_month_ago: 2012-02-29 00:00:00

其他回答

你应该使用dateutil。 有了它,你可以使用relativedelta,它是timedelta的改进版本。

>>> import datetime 
>>> import dateutil.relativedelta
>>> now = datetime.datetime.now()
>>> print now
2012-03-15 12:33:04.281248
>>> print now + dateutil.relativedelta.relativedelta(months=-1)
2012-02-15 12:33:04.281248

对于那些来到这里,并希望获得前一个月的第一天和最后一天的人:

from datetime import date, timedelta

last_day_of_prev_month = date.today().replace(day=1) - timedelta(days=1)

start_day_of_prev_month = date.today().replace(day=1) - timedelta(days=last_day_of_prev_month.day)

# For printing results
print("First day of prev month:", start_day_of_prev_month)
print("Last day of prev month:", last_day_of_prev_month)

输出:

First day of prev month: 2019-02-01
Last day of prev month: 2019-02-28

Datetime和Datetime。Timedelta类是您的朋友。

今天发现。 用这个找到这个月的第一天。 使用timedelta将某一天备份到上个月的最后一天。 打印您正在寻找的YYYYMM字符串。

是这样的:

 import datetime
 today = datetime.date.today()
 first = today.replace(day=1)
 last_month = first - datetime.timedelta(days=1)
 print(last_month.strftime("%Y%m"))
 

201202打印出来了。

这很简单。这样做

from dateutil.relativedelta import relativedelta
from datetime import datetime

today_date = datetime.today()
print "todays date time: %s" %today_date

one_month_ago = today_date - relativedelta(months=1)
print "one month ago date time: %s" % one_month_ago
print "one month ago date: %s" % one_month_ago.date()

输出如下: 美元python2.7 main.py

todays date time: 2016-09-06 02:13:01.937121
one month ago date time: 2016-08-06 02:13:01.937121
one month ago date: 2016-08-06

from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta

#Months(0-12) (1 for Previous month)

#last day of (n) previous month (n=months)
day = datetime(2023, 1, 13)
n = 1
lastDayMonth = ((day - relativedelta(months=n) + relativedelta(day=31)).date());

#First day of previous month (n=months=1)
firstDayMonth = ((day - relativedelta(months=n) + relativedelta(day=1)).date());

print("Last Day of Month - "+ str(lastDayMonth))
print("First Day of Month - "+ str(firstDayMonth))

#Last business day (Friday) of prev (n) month if last day on weekend
lastBusDay = (lastDayMonth - timedelta(max(1,(lastDayMonth.weekday() + 6) % 7 - 3))) if lastDayMonth.weekday() in (5,6) else lastDayMonth

print("Last Business Day of Month - " + str(lastBusinessDay))

print()