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.
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:
I don't like that it repeats the date string, but hopefully it goes some way to helping.
Script example (based on the accepted answer)
DT="20170601"
# get the Friday before $DT
# expected value is 20170526
date -d "$DT -`date -d "$DT +2 days" +%u` days" "+%Y%m%d"
Further examples, using undocumented features of GNU date (from unix.com)
# assign a value to the variable DT for the examples below
DT="2006-10-01 06:55:55"
echo $DT
# add 2 days, one hour and 5 sec to any date
date --date "$DT 2 days 1 hour 5 sec"
# subtract from any date
date --date "$DT 3 days 5 hours 10 sec ago"
date --date "$DT -3 days -5 hours -10 sec"
# or any mix of +/-. What will be the date in 3 months less 5 days?
date --date "now +3 months -5 days"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With