用于查找上一个日历日的Bash逻辑

时间:2013-06-30 23:05:03

标签: bash date

我想使用bash找出过去的日历日。

我试过以下

  

今天的日期:20130701预期输出:20130630

代码1:

myTime=`TZ=$TZ+24 date +'%Y%m%d'`
echo $myTime

输出

20130629

代码2:

timeB=$(date +%Y%m)
sysD=$(date +%d)
sysD=$((sysD-1))
echo $timeB$sysD

输出

2013070

Code3:

yest=$(date --date="yesterday")
echo "$yest"

输出

date: illegal option -- date=yesterday
usage:  date [-u] mmddHHMM[[cc]yy][.SS]
        date [-u] [+format]
        date -a [-]sss[.fff]

Code4:

$ date +%Y%m%d -d "yesterday"

输出

  

20130701

他们都没有给出正确的输出。任何人都可以告诉我正确的方法来获得理想的结果。

操作系统版本:SunOS 5.10

3 个答案:

答案 0 :(得分:4)

你可能有python。

python -c "import datetime; print datetime.date.today () - datetime.timedelta (days=1)"

但是,如果date支持-d标志,那么这将是我首选的解决方案。

答案 1 :(得分:3)

根据用法消息,我不认为您使用的是OS X.如果您使用的是OS X,则可以使用-v标志,但仅限于当前日期/时间:< / p>

$ date +%Y%m%d
20130630
$ date -v-1d +%Y%m%d
20130629

如果您有ksh可用,则可以使用它。我不确定可用的完整语法,所以我不知道你是否可以指定基准日期,但你可以相对于今天这样做:

$ ksh -c 'printf "%(%Y%m%d)T\n" yesterday'
20130629

Solaris(从版本10开始)仍然附带可疑的旧ksh88作为其默认ksh。您应该能够在ksh93中找到/usr/dt/bin/ksh(支持上述语法):

$ /usr/dt/bin/ksh -c 'printf "%(%Y%m%d)T\n" yesterday'
20130629

如果您有tclsh可用,则可以使用它:

$ echo 'puts [clock format [clock scan "yesterday"] -format %Y%m%d]' | tclsh
20130629
$ echo 'puts [clock format [clock scan "20130701 - 1 day"] -format %Y%m%d]' | tclsh
20130630

您已经说--date不起作用,但为了完整性:在使用GNU版date的系统上,您可以使用--date-d

$ date +%Y%m%d
20130630
$ date +%Y%m%d -d yesterday
20130629
$ date +%Y%m%d -d '-1 days'
20130629
$ date +%Y%m%d -d '20130701 - 1 day'
20130630

答案 2 :(得分:2)

有问题的系统很可能是Solaris。这适用于Solaris:

TZ=GMT+24+<YOUR_LOCAL_TIME_ADJUSTMENT> date +'%Y%m%d'

修改 考虑DST(GMT + 11 / GMT + 10与DST的例子):

actualdate=$(date +'%Y%m%d%H%M')
nondstdate=$(TZ=GMT+11 date +'%Y%m%d%H%M')

if [ $actualdate = $nondstdate ] ; then
    TZ=GMT+35 date +'%Y%m%d'
else
    TZ=GMT+34 date +'%Y%m%d'
fi

编辑2: 随机TZ和DST的防弹:

gmthour=$(date -u +%k)
localhour=$(date +%k)
tz=$(( gmthour - localhour ))
echo Your Timezone is $tz
yesterdaytz=$(( 24 + tz ))
echo the offset for yesterday is $yesterdaytz

TZ=GMT+$yesterdaytz date +'%Y%m%d'