전월 마지막 영업일을 얻기 위한 정기선이 필요함 [종료]

전월 마지막 영업일을 얻기 위한 정기선이 필요함 [종료]

예를 들어 오늘은 2018년 6월 4일이고 원하는 출력은 2018년 5월 31일입니다.

2018년 7월 1일의 경우 출력은 2018년 6월 29일이어야 합니다.

답변1

마지막 근무일을 구하고(근무주는 월요일부터 금요일까지라고 가정), 전월의 마지막 3일을 내림차순으로 출력하고, 주말이 아닌 첫 번째 날을 구합니다.

for m in {1..12}; do
    firstMonthDay="2018-$m-01"
    for i in {1..3}; do 
        read dow date <<<"$(date -d "$firstMonthDay - $i days" "+%u %c")"
        if [[ $dow -le 5 ]]; then 
            echo $date
            break
        fi
    done
done
Fri Dec 29 00:00:00 2017
Wed Jan 31 00:00:00 2018
Wed Feb 28 00:00:00 2018
Fri Mar 30 00:00:00 2018
Mon Apr 30 00:00:00 2018
Thu May 31 00:00:00 2018
Fri Jun 29 00:00:00 2018
Tue Jul 31 00:00:00 2018
Fri Aug 31 00:00:00 2018
Fri Sep 28 00:00:00 2018
Wed Oct 31 00:00:00 2018
Fri Nov 30 00:00:00 2018

내가 사용한 원하는 출력 날짜 형식을 조정하십시오.%c

가장 반복이 필요한 날인 31일 일요일, 30일 토요일, 29일 금요일이기 때문에 매월 마지막 3일을 사용합니다.


우리는 그것을 함수로 캡슐화합니다:

lastWorkdayPreviousMonth() { 
    local first fmt dow date i opt OPTIND=1

    while getopts :d:f: opt; do
        case $opt in 
            d) first=$OPTARG ;;
            f) fmt=$OPTARG ;;
        esac
    done
    : ${first:=$(date "+%Y-%m-01")} ${fmt:="%c"}

    for i in {1..3}; do
        read dow date <<<"$(date -d "$first- $i days" "+%u $fmt")"
        if [[ $dow -le 5 ]]; then
            echo $date
            break
        fi
    done
}

그 다음에

$ lastWorkdayPreviousMonth
Thu May 31 00:00:00 2018
$ for m in {1..12}; do lastWorkdayPreviousMonth -f "%d/%m/%Y" -d 2018-$m-01; done
29/12/2017
31/01/2018
28/02/2018
30/03/2018
30/04/2018
31/05/2018
29/06/2018
31/07/2018
31/08/2018
28/09/2018
31/10/2018
30/11/2018

답변2

다음 줄은 이전 달의 마지막 근무일을 인쇄합니다.

 day=`date -d "$(date +%m/01/%Y) -1 day" | awk '{print $1}'`; if [ $day == Sat ]; then  D=`date -d "$(date +%m/01/%Y) -2 day" "+%m/%d/%Y"`;echo $D; elif [ $day == Sun ]; then  D=`date -d "$(date +%m/01/%Y) -3 day" "+%m/%d/%Y"`;echo $D; else D=`date -d "$(date +%m/01/%Y) -1 day " "+%m/%d/%Y"`;echo $D; fi

정렬 코드:

day=`date -d "$(date +%m/01/%Y) -1 day" | awk '{print $1}'`; 
if [ $day == Sat ]; then  
    D=`date -d "$(date +%m/01/%Y) -2 day" "+%m/%d/%Y"`;
    echo $D; 
elif [ $day == Sun ]; then  
    D=`date -d "$(date +%m/01/%Y) -3 day" "+%m/%d/%Y"`;
    echo $D; 
else 
    D=`date -d "$(date +%m/01/%Y) -1 day " "+%m/%d/%Y"`;
    echo $D; 
fi

관련 정보