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
다음 date
time_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