In a unix shell, how to get yesterday's date into a variable?

前端 未结 17 1373
谎友^
谎友^ 2020-12-04 21:51

I\'ve got a shell script which does the following to store the current day\'s date in a variable \'dt\':

date \"+%a %d/%m/%Y\" | read dt
echo ${dt}


        
相关标签:
17条回答
  • 2020-12-04 22:31

    Though all good answers, unfortunately none of them worked for me. So I had to write something old school. ( I was on a bare minimal Linux OS )

    $ date -d @$( echo $(( $(date +%s)-$((60*60*24)) )) )
    

    You can combine this with date's usual formatting. Eg.

    $ date -d @$( echo $(( $(date +%s)-$((60*60*24)) )) ) +%Y-%m-%d
    

    Explanation : Take date input in terms of epoc seconds ( the -d option ), from which you would have subtracted one day equivalent seconds. This will give the date precisely one day back.

    0 讨论(0)
  • 2020-12-04 22:33
    dt=$(date --date yesterday "+%a %d/%m/%Y")
    echo $dt
    
    0 讨论(0)
  • 2020-12-04 22:34

    Try the following method:

    dt=`case "$OSTYPE" in darwin*) date -v-1d "+%s"; ;; *) date -d "1 days ago" "+%s"; esac`
    echo $dt
    

    It works on both Linux and OSX.

    0 讨论(0)
  • 2020-12-04 22:36

    Here is a ksh script to calculate the previous date of the first argument, tested on Solaris 10.

    #!/bin/ksh
     sep=""
     today=$(date '+%Y%m%d')
     today=${1:-today}
     ty=`echo $today|cut -b1-4` # today year
     tm=`echo $today|cut -b5-6` # today month
     td=`echo $today|cut -b7-8` # today day
     yy=0 # yesterday year
     ym=0 # yesterday month
     yd=0 # yesterday day
    
     if [ td -gt 1 ];
     then
             # today is not first of month
             let yy=ty       # same year
             let ym=tm       # same month
             let yd=td-1     # previous day
     else
             # today is first of month
             if [ tm -gt 1 ];
             then
                     # today is not first of year
                     let yy=ty       # same year
                     let ym=tm-1     # previous month
                     if [ ym -eq 1 -o ym -eq 3 -o ym -eq 5 -o ym -eq 7 -o ym -eq 8 -o ym -     eq 10 -o ym -eq 12 ];
                     then
                             let yd=31
                     fi
                     if [ ym -eq 4 -o ym -eq 6 -o ym -eq 9 -o ym -eq 11 ];
                     then
                             let yd=30
                     fi
                     if [ ym -eq 2 ];
                     then
                             # shit... :)
                             if [ ty%4 -eq 0 ];
                             then
                                     if [ ty%100 -eq 0 ];
                                     then
                                             if [ ty%400 -eq 0 ];
                                             then
                                             #echo divisible by 4, by 100, by 400
                                                     leap=1 
                                             else
                                             #echo divisible by 4, by 100, not by 400
                                                     leap=0
                                             fi
                                     else
                                             #echo divisible by 4, not by 100
                                             leap=1 
                                     fi
                             else
                                     #echo not divisible by 4
                                     leap=0 # not divisible by four
                             fi
                             let yd=28+leap
                     fi
             else
                     # today is first of year
                     # yesterday was 31-12-yy
                     let yy=ty-1     # previous year
                     let ym=12
                     let yd=31
             fi
     fi
     printf "%4d${sep}%02d${sep}%02d\n" $yy $ym $yd
    

    Tests

    bin$ for date in 20110902 20110901 20110812 20110801 20110301 20100301 20080301 21000301 20000301 20000101 ; do yesterday $date; done
    20110901
    20110831
    20110811
    20110731
    20110228
    20100228
    20080229
    21000228
    20000229
    19991231
    
    0 讨论(0)
  • 2020-12-04 22:38

    If your HP-UX installation has Tcl installed, you might find it's date arithmetic very readable (unfortunately the Tcl shell does not have a nice "-e" option like perl):

    dt=$(echo 'puts [clock format [clock scan yesterday] -format "%a %d/%m/%Y"]' | tclsh)
    echo "yesterday was $dt"
    

    This will handle all the daylight savings bother.

    0 讨论(0)
提交回复
热议问题