Bash – Date calculation using GNU date

bashdategnu

Using the GNU date command line utility, I know:

  • how to substract 3 days from any given date:
    date -d "20110405 -3 days" "+%Y%m%d"
    20110402

  • how to get the last Friday from today:
    date -d "last friday" "+%Y%m%d"
    20110408

But I don't know how to get the last Friday from any given date:
date -d "20110405 last friday" "+%Y%m%d"
Simply returns the given date:
20110405

Any ideas on how to do this? If a one-liner is not possible a few lines of script would also be helpful.

Best Solution

Ugly, but one line:

date -d "20110405 -2 days -$(date -d '20110405' '+%w') days" "+%Y%m%d"

EDIT: See comments.

date -d "20110405 -$(date -d "20110405 +2 days" +%u) days" "+%Y%m%d"

Explanation:

  • %w returns day of the week. Friday = 5 so take off 2 more days to get the right offset.
  • Works out as "20110405 -x days", where x is the number of days back to last Friday.

I don't like that it repeats the date string, but hopefully it goes some way to helping.