Solaris:通过 shell 脚本查找上周一、周二、...周日

Solaris:通过 shell 脚本查找上周一、周二、...周日

我正在拼命寻找一个 bash 或 ksh 例程,让我可以找到例如今天日期之前的上周一、周二、周三……。另外,它必须在普通的 Solaris X 上工作,而且我没有可用的 GNU 日期。

例如:今天 = 星期四 2013/01/17 ;假设我想找到最后星期一。它必须返回:2013/01/14

我设法在网上找到一个脚本,除了这种特殊情况外,它可以在所有日子里完美地完成工作:例如:今天=星期四2013/01/17;我想找到最后一个星期四,应该给出结果:2013/01/10;但我又得到了今天的日期。

使用的脚本是这样的:

#!/bin/ksh

#Get the nbr of the current weekday (1-7)
DATEWEEK=`date +"%u"`
#Which previous weekday will we need (1-7)
WEEKDAY=$1
# Main part
#Get current date
DAY=`date +"%d"`
MONTH=`date +"%m"`
YEAR=`date +"%Y"`
#Loop trough the dates in the past
COUNTER=0
if [[ $DATEWEEK -eq $WEEKDAY ]] ; then
# I need to do something special for the cases when I want to find the date of the same day last week
  DAYS_BACK=168
  DAY=`TZ=CST+$DAYS_BACK date +%d`
  echo "DAY (eq) = $DAY"
else
    while [[ $DATEWEEK -ne $WEEKDAY ]] ; do
       COUNTER=`expr $COUNTER + 1`
       echo "Counter is: $COUNTER"
       DAYS_BACK=`expr $COUNTER \* 24`
       echo "DAYS BACK is: $DAYS_BACK"
       DAY=`TZ=CST+$DAYS_BACK date +%d`
       echo "DAY is: $DAY"
        if [[ "$DAY" -eq 0 ]] ; then
         MONTH=`expr "$MONTH" - 1`
           if [[ "$MONTH" -eq 0 ]] ; then
            MONTH=12
           YEAR=`expr "$YEAR" - 1`
           fi
         fi
       DATEWEEK=`expr $DATEWEEK - 1`
     if [[ $DATEWEEK -eq 0 ]]; then
     DATEWEEK=7
     fi
done
fi
echo $DAY/$MONTH/$YEAR

答案1

我会做:

perl -MPOSIX -le '
  @t=localtime;
  print strftime "%Y/%m/%d", 
    localtime time - 86400*(($t[6]-1+7-$ARGV[0])%7+1)' 4

(其中 4 是星期几,0 表示星期日,4 表示星期四)

perl通常是便携式日期操作的最安全选择。

答案2

Shellscript + date 并不是真正最合适的工具。给出的 perl 答案已经很好了,尽管我更喜欢 python 的明确性:

import datetime, sys

today = datetime.date.today()
wd = today.weekday() # Mon == 0, Sun == 6
wd_wanted = int(sys.argv[1])

date_wanted = today - datetime.timedelta((wd-wd_wanted)%7 or 7)

or 7位解决了上周一今天是周一的问题。

答案3

由于发布的问题要求对普通 Solaris 'X' 提供 ksh 或 bash 答案,我想我不在指导范围内,但如果您可以安装 Tcl 8.5,您就可以访问强大的时钟命令来进行日期/时间算术:

调用 tclsh ...

% set delta 7                                
7
% clock format [clock scan "now - $delta days"]
Fri Jan 11 00:00:00 EST 2013

相关内容