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

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

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

그리고 나노초( ${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
    

관련 정보