두 개의 타임스탬프가 있습니다. 하나는 이렇고 24MAR17:00:14:09
다른 하나는 이렇습니다 2017-03-25 05:52:09.373941000
. 두 타임스탬프를 비교하여 동일한지 확인하고 싶습니다. 많은 날짜 함수와 awk 함수를 시도했지만 결과가 나오지 않습니다. 도와주세요.
답변1
세게 때리다해결책:
#!/bin/bash
d1='24MAR17:00:14:09'
d2='2017-03-25 05:52:09.373941000'
d1="$(sed -E 's/^([0-9]{2})([A-Z]{3})([0-9]{2}):/\1-\2-\3 /' <<< $d1)"
if [[ $(date -d "$d1") == $(date -d "$d2") ]]
then
echo "dates are equal"
else
echo "dates are unequal"
fi
답변2
이 시도,
시간을 2017-03-25 05:52:09.373941000
첫 번째 형식으로 변환 24MAR17:00:14:09
한 후 비교할 수 있습니다.
date_in="24MAR17:00:14:09"
date_out=`date +%d%b%y:%H:%M:%S -d "2017-03-25 05:52:09.373941000" | tr '[:lower:]' '[:upper:]'`
[ $date_in == $date_out ] && echo "The dates match"
답변3
주요 문제는 제공된 문자열을 구문 분석하는 것입니다. 날짜 명령은 전체 형식이 아닌 특정 형식만 허용합니다. 해결책은 (거의) 날짜를 수락하는 busybox의 기능을 활용하는 것입니다.어느체재.
D1
제공된 형식과 동일한 형식으로 날짜를 인쇄하는 형식 문자열을 만듭니다.
$ date -u +'%d%b%y:%T' 07Jul17:15:18:48
이 문자열을 사용하여 busybox 날짜에 날짜 문자열을 구문 분석하는 방법을 알려줍니다. 로컬 TZ는 결과를 변경할 수 있습니다. -u(UTC)를 사용하여 오류를 방지하거나 구문 분석되는 시간 문자열에 대해 올바른 TZ가 설정되었는지 확인하세요.
$ d1='24MAR17:00:14:09' $ busybox date -u -D '%d%b%y:%T' -d "$d1" Fri Mar 24 00:14:09 UTC 2017
비지박스 날짜를 초 단위로 값을 인쇄합니다(에포크 이후).
$ busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s' 1490314449
D2
두 번째 타임스탬프에 대해 프로세스를 반복할 수도 있지만 이 경우 문자열은 날짜로 직접 이해됩니다.
$ d2='2017-03-25 05:52:09.373941000'
$ date -u -d "$d2" +'%s'
1490421129
busybox 날짜에는 nanoseconds()가 제거되었습니다 ${d2%.*}
(나중에 자세히 설명).
$ busybox date -u -d "${d2%.*}" +'%s'
1490421129
차이점
위의 결과는 두 가지 변수로 캡처되어야 합니다.
$ resd1="$(busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s')"
$ resd2="$(date -u -d "$d2" +'%s')"
그런 다음 차이를 계산하고 0과 비교합니다.
$ (( resd1-resd2 )) && echo "Dates are different" || echo "Dates are equal"
Dates are different
또는 값 대신 문자열을 직접 비교합니다.
$ [[ "$resd1" == "$resd2" ]] && echo "equal" || echo "different"
different
나노초
나노초도 비교해야 한다면 세 가지 문제가 발생합니다.
첫 번째 값에는 나노초가 없습니다. 첫 번째는 첫 번째 날짜에 나노초 값이 없다는 것입니다.
9개의 0을 추가할 수 있습니다.$ resd1="$(busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s')" $ resd1="$resd1""$(printf '%0*d' 9 0)" $ echo "$resd1"echo "$resd2 - $resd1" 1490314449000000000
또는 (더 나은) 날짜를 사용하여 값을 다시 처리합니다.
$ resd1="$(date -u -d "@$resd1" +'%s%N')" $ echo "$resd1" 1490314449000000000
두 번째 날짜는 나노초입니다. 이 경우 두 번째 날짜는 날짜가 직접 처리할 수 있는 형식이지만 busybox 날짜별로 전처리해야 하는 형식이 있는 경우 나중에 나노초를 추가해야 합니다. 예를 들어:
$ d2='2017-03-25 05:52:09.373941000' $ resd2="$(busybox date -u -D '%Y-%m-%d %T' -d "$d2" +'%s')${d2##*.}" $ echo "$resd2" 1490421129373941000
또한 실행 중인 bash는 64비트 정수를 처리할 수 있어야 합니다.
그렇다면 차이를 계산해 보세요.$ echo "(( $resd2 - $resd1 ))" (( 1490421129373941000 - 1490314449000000000 )) $ echo "$(( $resd1 - $resd2 ))" 106680373941000
106,000초가 조금 넘는 시간(약 29시간):
$ echo "$(( ($resd2 - $resd1)/10**9 ))" 106680