두 타임 스탬프 사이의 차이를 밀리 초까지 찾는 방법은 무엇입니까?


10

쉘 스크립팅을 처음 사용합니다. 내 스크립트의 핵심은 두 타임 스탬프 사이의 차이를 밀리 초까지 찾는 것입니다. 나와 함께 타임 스탬프 내용이있는 파일 만

2012-09-13 15:00:29,290 2012-09-13 15:00:29,297
2012-09-13 15:00:29,428 2012-09-13 15:00:29,447

이와 같이 스크립트를 실행할 때 성능 문제가 발생하지 않는 약 30k 레코드가 있습니다. 이것을 위해 스크립트를 작성하려고 할 때 윤년, 31 일이있는 달 등 많은 요인이 나타납니다.

누구든지 도와주세요.


1
DST가 사진에 등장합니까? 윤초? DST 규칙은 무엇입니까? 그들은 당신의 나라에서 시간이 지남에 따라 변했습니까? 1970 년 이전의 날짜 나 그레고리력으로 전환하기 전에 날짜를 처리해야합니까?
Stéphane Chazelas

답변:


13

복잡한 파싱을 할 필요가 없습니다. 는 친구 의 도움으로 모든 마술을 할 것입니다 .

#!/bin/bash
while read d1_1 d1_2 d2_1 d2_2; do
  secdiff=$((
    $(date -d "$d2_1 $d2_2" +%s) - $(date -d "$d1_1 $d1_2" +%s)
  ))
  nanosecdiff=$((
    $(date -d "$d2_1 $d2_2" +%N) - $(date -d "$d1_1 $d1_2" +%N)
  ))
  printf "%s %s - %s %s = %d milliseconds\n" $d2_1 $d2_2 $d1_1 $d1_2 $((
    (secdiff * 1000) + (nanosecdiff / 1000000)
  ))
done < YOUR_FILE.txt

산출

2012-09-13 15:00:29,297 - 2012-09-13 15:00:29,290 = 7 milliseconds
2012-09-13 15:00:29,447 - 2012-09-13 15:00:29,428 = 19 milliseconds

보다 man date

노트

이것도 당신의 필요에 맞습니까?


1
산술 오류가 수정되었습니다 (초와 나노초 연결). 지금은 첫 번째 (OP 재 사용 완전성과 견고성이 요청하지 않지만) 초를 계산
질 Quenot

0

Perl, Python 또는 Ruby와 같은 스크립팅 언어는 빠르며 노력이 거의 필요하지 않습니다. 예를 들어, Perl 및 Date :: Parse :

perl -MDate::Parse -l -ne 's/,/./g; split; print str2time("$_[2] $_[3]") - str2time("$_[0] $_[1]")'

(각 줄에 대해로 바꾸고 ,를 통해 .줄로 나누고 처음 두 단어와 다음 두 단어로 구성된 날짜를 구문 분석 한 다음 차이를 인쇄하십시오.)$_[0]$_[3]


"작은 노력"은 상대적입니다. 물론, X 프로그래머이고 Y 라이브러리에 대해 알고 있다면 문제가 될 것입니다. 그것이 항상 그런 식입니다. 사실, 파이썬 프로그래머가 아직 여기에 뛰어 들지 않은 것에 놀랐습니다. 난 그냥 시간 문제라고 생각합니다 ... :-\
Mike S

사람들이 여기에 완전한 솔루션을 제공하는 이유입니다. 그렇게하면 X 프로그래머가 아니거나 Y 라이브러리에 대해 알 필요가 없습니다. 그리고 당신은 여전히 ​​10에서가 아니라 스크립트에서 한 줄을 갖는 "작은 노력"의 혜택을
받습니다

0

방금이 게시물을 date보았습니다. 적어도 오늘은 더 간단한 기반의 솔루션이 있습니다. @Gilles Quenot의 답변에 프레임 워크를 사용하면 (그의 anwser에게 의견을 쓰지 만 평판이 충분하지는 않습니다) :

while read d1_1 d1_2 d2_1 d2_2
do
    date -d "$d2_1 $d2_2 $(date -d "$d1_1 $d1_2" +%s.%N) seconds ago" +%s.%N
done << END
2012-09-13 15:00:29,290 2012-09-13 15:00:29,297
END

결과:

$ ./time_elapsed.sh 
0.007000000

사용 %3N대신하여 %N밀리 초에 출력을 자릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.