The problem is that date
takes your request quite literally and tries to use a date of 31st September (being 31st October minus one month) and then because that doesn’t exist it moves to the next day which does. The date
documentation (from info date
) has the following advice:
The fuzz in units can cause problems with relative items. For
example, `2003-07-31 -1 month’ might evaluate to 2003-07-01, because
2003-06-31 is an invalid date. To determine the previous month more
reliably, you can ask for the month before the 15th of the current
month. For example:$ date -R Thu, 31 Jul 2003 13:02:39 -0700 $ date --date="-1 month" +'Last month was %B?' Last month was July? $ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!' Last month was June!