두 타임스탬프를 비교하는 방법은 무엇입니까?

두 타임스탬프를 비교하는 방법은 무엇입니까?

두 개의 타임스탬프가 있습니다. 하나는 이렇고 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

  1. 제공된 형식과 동일한 형식으로 날짜를 인쇄하는 형식 문자열을 만듭니다.

    $ date -u +'%d%b%y:%T'
    07Jul17:15:18:48
    
  2. 이 문자열을 사용하여 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
    
  3. 비지박스 날짜를 초 단위로 값을 인쇄합니다(에포크 이후).

    $ 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

나노초

나노초도 비교해야 한다면 세 가지 문제가 발생합니다.

  1. 첫 번째 값에는 나노초가 없습니다. 첫 번째는 첫 번째 날짜에 나노초 값이 없다는 것입니다.
    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
    
  2. 두 번째 날짜는 나노초입니다. 이 경우 두 번째 날짜는 날짜가 직접 처리할 수 있는 형식이지만 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
    
  3. 또한 실행 중인 bash는 64비트 정수를 처리할 수 있어야 합니다.
    그렇다면 차이를 계산해 보세요.

    $ echo "(( $resd2 - $resd1 ))"
    (( 1490421129373941000 - 1490314449000000000 ))
    
    $ echo "$(( $resd1 - $resd2 ))"
    106680373941000
    

    106,000초가 조금 넘는 시간(약 29시간):

    $ echo "$(( ($resd2 - $resd1)/10**9 ))"
    106680
    

관련 정보