예를 들어 지난 월요일, 화요일, 수요일... 오늘 날짜 이전을 찾을 수 있는 bash 또는 ksh 루틴을 필사적으로 찾고 있습니다. 또한 순정 Solaris X에서 작동해야 하는데 GNU 날짜를 알 수 없습니다.
예: 오늘 = 목요일 2013/01/17 마지막 월요일을 찾고 싶다고 가정해 보겠습니다. 반드시 반환되어야 합니다: 2013/01/14
나는 이 특별한 경우를 제외하고 모든 날에 완벽하게 작동하는 스크립트를 온라인에서 찾았습니다. 예: Today = 목요일 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를 설치할 수 있다면 date/에 대한 강력한 시계 명령에 액세스할 수 있습니다. 시간 산술:
tclsh에 전화해...
% set delta 7
7
% clock format [clock scan "now - $delta days"]
Fri Jan 11 00:00:00 EST 2013