How can I print the date which is a day before current time in Bash?
20 Answers
if you have GNU date and i understood you correctly
$ date +%Y:%m:%d -d "yesterday" 2009:11:09 or
$ date +%Y:%m:%d -d "1 day ago" 2009:11:09 7 Comments
date -v-1d on OSX (minus), -v+1d (plus)date_days_past () { days_past=${1:-0}; if ! date -v-${days_past}d +%Y%m%d 2>/dev/null; then date --date="-${days_past} day" +%Y%m%d; fi }date --date='-1 day' 2 Comments
date: illegal option -- -date, available through the coreutils package, to make this syntax work on macOS. If you're using Homebrew, you can install it via brew install coreutils, after which you should be able to use GNU date through the gdate command. See: topbug.net/blog/2013/04/14/…MAC OSX
For yesterday's date:
date -v-1d +%F where 1d defines current day minus 1 day. Similarly,
date -v-1w +%F - for previous week date
date -v-1m +%F - for previous month date
IF YOU HAVE GNU DATE,
date --date="1 day ago" More info: https://www.cyberciti.biz/tips/linux-unix-get-yesterdays-tomorrows-date.html
Comments
date +%Y:%m:%d -d "yesterday" For details about the date format see the man page for date
date --date='-1 day' Comments
Sorry not mentioning I on Solaris system. As such, the -date switch is not available on Solaris bash.
I find out I can get the previous date with little trick on timezone.
DATE=`TZ=MYT+16 date +%Y-%m-%d_%r` echo $DATE 3 Comments
bash $(TZ=America/New_York date +%Y-%m-%d) date -d "yesterday" '+%Y-%m-%d' or
date=$(date -d "yesterday" '+%Y-%m-%d') echo $date 1 Comment
date: illegal option: -d on Solaris. Your answer that relies on non-portable GNU extensions to the POSIX-standard date utility for a question about the non-GNU Solaris platform.Use Perl instead perhaps?
perl -e 'print scalar localtime( time - 86400 ) . "\n";' Or, use nawk and (ab)use /usr/bin/adb:
nawk 'BEGIN{printf "0t%d=Y\n", srand()-86400}' | adb Came across this too ... insane!
/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= '/^time\(\)/ {gsub(/ /,"",$2);printf "0t%d=Y\n", $2-86400}' | adb Comments
short answer (GNU format):
date +%Y-%m-%d -d "-2 day" if you are using OSX, but you need create for GNU compatible, install coreutils first
brew install coreutils then edit your profile with:
#gnu coreutils first export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" re-start your terminal, and now you able to use GNU format!
Comments
You could do a simple calculation, pimped with an regex, if the chosen date format is 'YYYYMM':
echo $(($(date +"%Y%m") - 1)) | sed -e 's/99$/12/' In January of 2020 it will return 201912 ;-) But, it's only a workaround, when date does not have calculation options and other dateinterpreter options (e.g. using perl) not available ;-)
Comments
#!/bin/bash OFFSET=1; eval `date "+day=%d; month=%m; year=%Y"` # Subtract offset from day, if it goes below one use 'cal' # to determine the number of days in the previous month. day=`expr $day - $OFFSET` if [ $day -le 0 ] ;then month=`expr $month - 1` if [ $month -eq 0 ] ;then year=`expr $year - 1` month=12 fi set `cal $month $year` xday=${$#} day=`expr $xday + $day` fi echo $year-$month-$day 4 Comments
1 July , 2013 , the result being printed out is 2013-6-1347, whereas the expected result is 2013-6-30echo $(cal $month $year)|tr ' ' '\n'|tail -n 1"DST aware solution:
Manipulating the Timezone is possible for changing the clock some hours. Due to the daylight saving time, 24 hours ago can be today or the day before yesterday.
You are sure that yesterday is 20 or 30 hours ago. Which one? Well, the most recent one that is not today.
echo -e "$(TZ=GMT+30 date +%Y-%m-%d)\n$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1 The -e parameter used in the echo command is needed with bash, but will not work with ksh. In ksh you can use the same command without the -e flag.
When your script will be used in different environments, you can start the script with #!/bin/ksh or #!/bin/bash. You could also replace the \n by a newline:
echo "$(TZ=GMT+30 date +%Y-%m-%d) $(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1 Comments
Try the below code , which takes care of the DST part as well.
if [ $(date +%w) -eq $(date -u +%w) ]; then tz=$(( 10#$gmthour - 10#$localhour )) else tz=$(( 24 - 10#$gmthour + 10#$localhour )) fi echo $tz myTime=`TZ=GMT+$tz date +'%Y%m%d'` Courtsey Ansgar Wiechers
Comments
For my case I needed a portable solution to get the number of seconds since the epoch one hour ago, and this worked on both ubuntu and macOS:
$(( $(date +%s) - 3600 )) Explaining this:
$(( ))is doing an arithmetic expansiondate +%sseems to be a portable way to get seconds since epoch- 3600 seconds in an hour
Hope this helps!
Comments
date +%Y:%m:%d|awk -vFS=":" -vOFS=":" '{$3=$3-1;print}' 2009:11:9
--dateor-doption is only available in GNU date