![날짜 합계 계산](https://linux55.com/image/89968/%EB%82%A0%EC%A7%9C%20%ED%95%A9%EA%B3%84%20%EA%B3%84%EC%82%B0.png)
우리는 작업이 실행된 시간(분)을 기준으로 정보를 추출하는 타사 스크립트를 사용합니다. 스크립트에 이 입력이 필요합니다.
예를 들어
이것은 예입니다.
export etool_start=`date +"%Y%m%d%H%M:"`
내 기본 스크립트는 시작 시간과 종료 시간 사이에 실행됩니다.
export etool_end=`date +"%Y%m%d%H%M"`
위 결과의 출력은 201607050220:201607050230과 같습니다. 시간은 0220~0230입니다. 내 스크립트는 이 날짜 유형을 허용하지 않으며 -0010(10분)과 같은 분만 허용합니다. 이 결과를 얻는 데 도움이 되는 수학을 어떻게 만들 수 있습니까? 제가 제시한 시간은 단지 예시일 뿐이며, 샘플링 간격은 2분에서 120분, 하루까지 가능합니다. 이런 종류의 출력을 얻으려면 date 명령을 어떻게 사용합니까?
도와주세요.
감사해요.
답변1
에포크( ) 이후의 시간을 초 단위로 측정하는 것이 훨씬 간단합니다. +%s
그런 다음 빼서 초 단위의 경과 시간을 찾고, 초를 분으로 변환하려면 60으로 나누면 됩니다.
export etool_start=$(date +"%s")
do_stuff_with_etool
export etool_stop=$(date +"%s")
echo "elapsed time=$(( (etool_stop - etool_start)/60 )) minutes"
인간 형태의 시간이 정말로 필요하다면 변환할 수 있습니다. GNU 사용 date
:
$ date -d "@$etool_start"
Tue Jul 5 21:30:19 PDT 2016
또는:
$ date -d "@$etool_start" "+%Y%m%d%H%M"
201607052130
서식 지정에 대한 추가 정보
경과 시간을 다양한 형식으로 분 단위로 표시하려면 를 사용할 수 있습니다 printf
. 예를 들어, 4자리 경과 시간을 생성하려면 다음 형식을 사용할 수 있습니다 %04i
.
$ printf '%04i\n' "$(( ($etool_stop - $etool_start)/60 ))"
0001
의 형식은 %4i
4자리 정수(i)를 제공합니다. 선행 공백 대신 선행 0을 원하면 를 사용합니다 %04i
.
숫자의 반대 부호를 원하는 경우:
$ printf '%05i\n' "$(( ($etool_start - $etool_stop)/60 ))"
-0035
빼기 기호에는 추가 문자가 필요하므로 할당된 공간을 4에서 5로 늘립니다 %05i
.
더 많은 해결 방법
위의 예에서는 bash 산술을 사용하므로 정수일 뿐입니다. 경과 시간을 분 단위(분 단위 포함)로 확인하려면 다음 bc
과 같은 다른 도구를 사용할 수 있습니다.
$ echo "($etool_stop - $etool_start)/60" | bc -l
1.38333333333333333333
에포크 이후 몇 초가 지났나요?
epoch 이후의 초 수는 man date
다음과 같이 정의됩니다.
1970-01-01 00:00:00 UTC 이후 %s초
이렇게 정의되므로 현지 시간대는 중요하지 않습니다. 따라서 -u
"현지 시간대" 또는 세계 시간으로 계산하는 데 차이가 없습니다.
$ date +%s; date -u +%s
1467780345
1467780345
답변2
배쉬에서:
$ export etool_starting=`date -u +"%s"`
$ export etool_ending=`date -u +"%s"`
몇 분 밖에 걸리지 않는 경우:
$ printf '%05d\n' "$(( (etool_starting - etool_ending) / 60 ))"
-0120 ### If 120 minutes have elapsed in between.