2012-04-20 4 views
2

Find day difference between two dates (excluding weekend days)과 동일한 문제가 있지만 자바 스크립트입니다. 어떻게 유닉스 (KSH)에서 그것을 할 수 있습니까?Unix에서 두 datetimes (주말 제외)의 차이점을 찾는 방법은 무엇입니까?

+0

왜 당신이 질문을 중복나요? –

+0

이것은 중복되지 않습니다. korn 쉘 유닉스 용 스크립트가 필요 없습니다. 작동하지 않습니다. – user1345801

+0

날짜 사이의 날짜를 찾는 코드가 있습니다. 나는 거기에서 주말을 건너 뛸 필요가있다. 예를 들어 20-4-2012에서 24-4-2012까지는 4 일이지만 21과 22는 주말이므로 결과는 2가되어야합니다. – user1345801

답변

1

내 Bash 스크립트는 Ksh에서 비슷할 것이라고 생각합니다.

#! /bin/bash 

#Usage dateDiff startDate endDate 

startDate="$1 00:00:00" 
endDate="$2 tomorrow 00:00:00" #tomorrow to include both days 

stampEnd=`date -d "$endDate" +%s` 
stampStart=`date -d "$startDate" +%s` 

#difference in calendar days 
daysDiff=`echo "($stampEnd - $stampStart)/(60 * 60 * 24)" | bc`; 

#week day 
weekDay=`date -d "$endDate" +%u`; 

weekEndsLastWeek=`echo "$weekDay - 6" | bc`; 
if test $weekEndsLastWeek -lt 0; then 
    weekEndsLastWeek=0; 
fi 

if test $weekEndsLastWeek -gt $daysDiff; then 
    weekEndsLastWeek=$daysDiff 
fi 

#normalize - make endDate a Sunday 
if test $weekDay -ne 1; then #if not a Sunday already 
    daysDiffSunday=`echo "$daysDiff - ($weekDay - 1)" | bc`; 
else 
    daysDiffSunday=$daysDiff; 
fi 

firstWeekends=0; 
weekends=0; 

if test $daysDiffSunday -ge 0; then 
    firstWeekends=`echo "$daysDiffSunday % 7" | bc`; 
    if test $firstWeekends -gt 2; then 
     firstWeekends=2 
    fi 
    weekends=`echo "$daysDiffSunday/7 * 2" | bc`; 
fi; 

echo "$daysDiff - $weekends - $firstWeekends - $weekEndsLastWeek" | bc 

내 테스트 데이터 :

04/20/2012 04/22/2012 1 
04/20/2012 04/25/2012 4 
04/20/2012 04/30/2012 7 
04/20/2012 04/28/2012 6 
04/18/2012 04/21/2012 3 
04/18/2012 04/22/2012 3 
04/14/2012 04/21/2012 5 
04/14/2012 04/22/2012 5 
04/15/2012 04/21/2012 5 
04/15/2012 04/22/2012 5 

테스트 스크립트를

allPassed=1 
while read line; do 
    set $line; 
    result=`./dateDiff $1 $2`; 
    expected="$3"; 
    if test "$result" -ne "$expected"; then 
     echo "Error in test $line: expected $expected, result $result" 1>&2 
     allPassed=0 
    fi; 
done 
if test $allPassed -eq 1; then 
    echo "All tests passed"; 
fi 
0
#/bin/ksh 

DATE1="2005-09-01" 
DATE2="2011-02-20" 

typeset -L4 y1 y2 
typeset -Z -R2 m d 

y1=$DATE1 
y2=$DATE2 

c=0 
while [[ $y1 -le $y2 ]] 
do 
for m in 1 2 3 4 5 6 7 8 9 10 11 12 
do 
    for d in $(cal $m $y1) 
    do 
     [[ "${d# }" < "A" ]] && { 
     ((c = c + 1)) 
     [[ "$y1-$m-$d" = "$DATE1" ]] && d1=$c 
     [[ "$y1-$m-$d" = "$DATE2" ]] && { 
      d2=$c 
      break; 
     } 
     } 
    done 
done 
((y1 = y1 + 1)) 
done 
((days = d2 - d1)) 
echo $days 
+1

코드 대신 많은 설명을 제공 할 수 있습니까? –

관련 문제