yyyymmddhhmmss 형식으로 날짜 및 시간 빼기

yyyymmddhhmmss 형식으로 날짜 및 시간 빼기

yyyymmddhhmmss쉘 변수에 두 가지 형식의 날짜/시간 값이 있습니다 .
나는 하나를 다른 것에서 빼고 다음과 같이 몇 초 안에 결과를 얻고 싶습니다.

a=20170804020000
b=20170804015959
c=a-b

내가 원하는 결과는 c=1( 02:00:00보다 1초 늦기 때문에 01:59:59) 이지만 결과는 입니다 c=4041.

초 단위로 결과를 얻으려면 날짜/시간 값을 어떻게 뺄 수 있나요?

답변1

먼저 날짜를 unix time_t 형식(즉, "epoch" 1970-01-01 00:00:00 이후의 초 수)으로 변환해야 합니다. 그런 다음 간단한 빼기로 차이를 계산할 수 있습니다.

프로그램은 date현재 형식의 날짜를 이해할 수 없습니다. 숫자보다는 대시와 콜론으로 구분된 필드가 있는 날짜와 더 유사한 것을 기대합니다.

sed다음은 함수에서 "고정" 날짜를 사용하는 예입니다. 즉, 이해할 수 있는 형식으로 변환한 date다음 datetime_t 초로 변환을 사용하고 빼는 것입니다.

#!/bin/bash

a=20170804020000
b=20170804015959

function fixdate() {
  printf "$1" | sed -E -e 's/(....)(..)(..)(..)(..)(..)/\1-\2-\3 \4:\5:\6/'
}

a_seconds="$(date -d "$(fixdate "$a")" '+%s')"
b_seconds="$(date -d "$(fixdate "$b")" '+%s')"
seconds=$((a_seconds - b_seconds))

echo "$seconds"

답변2

예쁘지는 않지만 Centos에서는 이것이 작동합니다.

a=20170804020000

b=20170804015959

ayear=${a:0:4}
amonth=${a:4:2}
aday=${a:6:2}
ahour=${a:8:2}
amin=${a:10:2}
asec=${a:12:2}

byear=${b:0:4}
bmonth=${b:4:2}
bday=${b:6:2}
bhour=${b:8:2}
bmin=${b:10:2}
bsec=${b:12:2}

adate=$(date -d "$amonth/$aday/$ayear $ahour:$amin:$asec" +"%s")
bdate=$(date -d "$bmonth/$bday/$byear $bhour:$bmin:$bsec" +"%s")
datediff=$((adate-bdate))

답변3

날짜를 Unix 형식으로 변환하여 수학 연산을 수행할 수 있습니다. 하지만 이렇게 하려면 먼저 이러한 값(yyyymmddhhmmss)에 적절한 형식(yyyy-mm-dd hh:mm:ss)을 제공해야 합니다.

그러면 다음과 같이 할 수 있습니다:

$ a=$(date -d '2017-08-04 02:00:00' '+%s')
$ b=$(date -d '2017-08-04 01:59:59' '+%s')
$ c=$((a-b))
$ echo $a
1501830000
$ echo $b
1501829999
$ echo $c
1

관련 정보