"datetime" 타임스탬프가 두 "datetime" 타임스탬프 사이에 있는지 확인하는 방법

"datetime" 타임스탬프가 두 "datetime" 타임스탬프 사이에 있는지 확인하는 방법

타임스탬프가 두 타임스탬프 사이에 있는지 확인하는 여러 가지 방법을 검색하고 찾았지만 모든 방법방법 가정 HH:MM:SS형식만 고려하지 말고 형식만 고려하세요.날짜.

내 실제 시나리오는 날짜 및 밀리초를 포함한 일반적인 형식의 로그 파일의 입력 타임스탬프입니다 2019-11-11 19:05:55,823.

주어진 타임스탬프가 있다고 가정합니다 2019-11-11 19:05:55,823. 그것이 범위 내에 있는지 밖에 있는지 어떻게 확인합니까?

2019-11-11 17:02:54,479
2019-11-12 05:13:55,998

?

답변1

특히 bash의 경우 문제가 될 것입니다.

start='2019-11-11 17:02:54,479'
end='2019-11-12 05:13:55,998'
date='2019-11-11 19:05:55,823'

if LC_ALL=C command eval '[[ ! $date < $start && ! $date > $end ]]'; then 
  echo the date is in the range
fi

이는 어휘 비교를 수행합니다. 이는 C 로케일에서 이러한 날짜 표현이 어휘 및 시간순으로 동일하기 때문에 작동합니다.

bash연산자는 문자열을 비교 [[ < / > ]]하는 데 사용되므로 strcoll()지역화된 정렬 알고리즘이 사용됩니다. C 로케일에서는 strcoll()와 같은 의미입니다 strcmp(). 다른 로케일에서는 해당 로케일의 규칙에 따라 비교하므로 결과에 대해 많은 보장을 받을 수 없습니다.

POSIXly에서는 다음을 사용할 수 있습니다.

if LC_ALL=C expr "x $date" '>=' "x $start" '&' "x $date" '<=' "x $end" > /dev/null; then
  echo the date is in the range
fi

awk이제 로그 파일로 작업하는 경우 타임스탬프가 각 줄의 시작 부분에 있다고 가정하여 이 작업을 수행할 수 있습니다 .

LC_ALL=C awk -v start='2019-11-11 17:02:54,479' \
             -v end='2019-11-12 05:13:55,998' '
   $0 >= start && $0 <= end' < file.log

이 범위의 타임스탬프로 시작하는 줄이 인쇄됩니다.

관련 정보