【问题标题】:Shell script that calculates the previous Monday, Tuesday,... relative to today计算前一个星期一、星期二、...相对于今天的 Shell 脚本
【发布时间】:2013-01-18 19:16:36
【问题描述】:

我正在拼命地寻找一个 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

【问题讨论】:

  • 你有可用的 perl 吗?
  • 试试:date -v1w -v-mon.
  • 对不起,那是bsd版本。

标签: shell unix date solaris


【解决方案1】:

(我之前的建议并没有像我想象的那样奏效。昨晚已经很晚了......)

关键是今天忽略,但仍然循环。试试这样:

#!/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
while [ $COUNTER -eq 0 ] || [[ $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
echo $DAY/$MONTH/$YEAR

不过,您的 DAY=`TZ=CST+$DAYS_BACK date +%d` 技巧对我不起作用。 Linux date 似乎总有一天会结束。

【讨论】:

  • 嗯,我认为这显然可以解决他的问题。但它会破坏最终数据。 :( 我已将解决方案更改为可行的解决方案。
【解决方案2】:

这行得通吗?

today=$(date +"%u")
weekday=$1
curdate=$(date +"%s")
gobackdays=$(($today - $weekday))
if [ $gobackdays -le 0 ]; then
  let gobackdays+=7
fi
SECSDAY=86400
backtime=$(($curdate - $gobackdays * $SECSDAY))
echo $(date -d "@$backtime")

【讨论】:

    猜你喜欢
    • 2016-10-08
    • 2012-05-06
    • 2019-10-19
    • 2011-05-08
    • 1970-01-01
    • 2023-01-19
    • 2021-09-06
    • 2012-01-28
    • 2019-08-09
    相关资源
    最近更新 更多