[bash] 두 날짜 간의 날짜 차이를 찾는 방법은 무엇입니까?

A = “2002-20-10”
B = “2003-22-11”

두 날짜 간의 날짜 차이를 찾는 방법은 무엇입니까?



답변

GNU date가있는 경우 임의의 날짜 표시 ( -d옵션) 를 인쇄 할 수 있습니다 . 이 경우 EPOCH 이후 날짜를 초로 변환하고 빼고 24 * 3600으로 나눕니다.

아니면 휴대용 방법이 필요하십니까?


답변

bash 방식-날짜를 % y % m % d 형식으로 변환 한 다음 명령 줄에서 직접 수행 할 수 있습니다.

echo $(( ($(date --date="031122" +%s) - $(date --date="021020" +%s) )/(60*60*24) ))


답변

tl; dr

date_diff=$(( ($(date -d "2015-03-11 UTC" +%s) - $(date -d "2015-03-05 UTC" +%s)) / (60*60*24) ))

조심해! 여기에있는 많은 bash 솔루션은 일광 절약 시간이 시작되는 날짜 (해당되는 경우)에 걸쳐있는 날짜 범위에 대해 손상되었습니다. 이는 $ ((math)) 구문이 결과 값에 대해 ‘floor’/ truncation 연산을 수행하여 정수만 반환하기 때문입니다. 설명하겠습니다.

DST는 올해 미국에서 3 월 8 일에 시작되었으므로 다음과 같은 기간을 사용하겠습니다.

start_ts=$(date -d "2015-03-05" '+%s')
end_ts=$(date -d "2015-03-11" '+%s')

이중 괄호로 무엇을 얻었는지 봅시다 :

echo $(( ( end_ts - start_ts )/(60*60*24) ))

‘5’를 반환합니다.

‘bc’를 더 정확하게 사용하면 다른 결과를 얻을 수 있습니다.

echo "scale=2; ( $end_ts - $start_ts )/(60*60*24)" | bc

‘5.95’를 반환합니다. 누락 된 0.05는 DST 전환으로 인한 손실 시간입니다.

그렇다면 이것이 어떻게 올바르게 수행되어야합니까?
대신 이것을 사용하는 것이 좋습니다.

printf "%.0f" $(echo "scale=2; ( $end_ts - $start_ts )/(60*60*24)" | bc)

여기서 ‘printf’는 ‘bc’로 계산 된 더 정확한 결과를 반올림하여 정확한 날짜 범위 ‘6’을 제공합니다.

편집 : 최근에 사용하고있는 @ hank-schultz의 의견에서 답변을 강조 표시합니다.

date_diff=$(( ($(date -d "2015-03-11 UTC" +%s) - $(date -d "2015-03-05 UTC" +%s) )/(60*60*24) ))

윤초는 차이에 더해지기 때문에 항상 나중 날짜에서 이전 날짜를 빼는 한 윤초는 안전해야합니다. 잘림은 올바른 결과로 효과적으로 반올림됩니다.


답변

그리고 파이썬에서

$python -c "from datetime import date; print (date(2003,11,22)-date(2002,10,20)).days"
398


답변

이것은 나를 위해 작동합니다.

A="2002-10-20"
B="2003-11-22"
echo $(( ($(date -d $B +%s) - $(date -d $A +%s)) / 86400 )) days

인쇄물

398 days

무슨 일이야?

  1. AB 에 유효한 시간 문자열을 제공하십시오.
  2. 사용 date -d처리 시간 문자열로
  3. date %s1970 년 이후의 시간 문자열을 초로 변환하는 데 사용 합니다 (unix epoche).
  4. bash 매개 변수 확장 을 사용 하여 초를 뺍니다.
  5. 하루에 초로 나누기 (86400 = 60 * 60 * 24)
  6. ! DST 는 고려되지 않습니다! unix.stackexchange 에서이 답변을 참조하십시오 !


답변

-d 옵션이 시스템에서 작동하는 경우 다른 방법이 있습니다. 1 년 365 일을 고려했기 때문에 윤년을 설명하지 않을 것이라는 경고가 있습니다.

date1yrs=`date -d "20100209" +%Y`
date1days=`date -d "20100209" +%j`
date2yrs=`date +%Y`
date2days=`date +%j`
diffyr=`expr $date2yrs - $date1yrs`
diffyr2days=`expr $diffyr \* 365`
diffdays=`expr $date2days - $date1days`
echo `expr $diffyr2days + $diffdays`


답변

편의를 위해 MAC OS X 버전이 있습니다.

$ A="2002-20-10"; B="2003-22-11";
$ echo $(((`date -jf %Y-%d-%m $B +%s` - `date -jf %Y-%d-%m $A +%s`)/86400))

nJoy!