2017-11-28 8 views
0

를 사용하여 Linux 시간을 검색? Epoch 이후로 시간을줍니다. 이 데이터 유형을 사용하여 실제 Linux 시간을 가져올 수 있습니까?내가</p> <blockquote> <p>구조체 timespec에 TS</p> </blockquote> <p>유형을 사용하여 리눅스 시간을 검색 할 수있는 방법을 누군가가 제안 주시겠습니까 구조체 timespec이

간략한 배경 : 타임 스탬프 해상도가 밀리 초/마이크로 초인 임베디드 장치에 로거 유틸리티를 쓰고 있습니다. 소스는 대상 구성 요소가 소비하는 시간 소인을 추가합니다.

struct stLogItem logitem; //stLogItem has a member, struct timespec ts  
clock_gettime(clk_id, &logitem.ts); 

대상 구성 요소가이 로그 타임 스탬프를 파일/console에 인쇄하고 있습니다. 그러나 인쇄 된 날짜는 실제 Linux 날짜가 아닌 Epoch 이후의 시간입니다.

인쇄 데이터는 다음 1970-01-01 23 : 30 :

루트 @의 IMH : 아래와 같이 리눅스 날짜가 상이하다 07.586864475

반면 # 날짜

화 11월 14일 세계 협정시 11시 34분 12초 2017

형식 문제가 아닙니다. 그것은 현재의 리눅스 시간을 (나노초로) 얻는 것에 관한 것입니다. 일에서 당신을 유지 무엇 ​​

+2

"실제 Linux 시간"이란 무엇입니까? Linus의 첫 번째 발표 이후 시간? :) – unwind

+0

'localtime *()'을보고 싶을 수도 있습니다. – alk

+0

Tue Nov 14 10:06:34 UTC 2017 (쉘에 "date"입력 후) – Irfan

답변

3

는 :

#include <time.h> 
#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
    struct timespec ts;  
    clock_gettime(CLOCK_REALTIME, &ts); 

    char * p = ctime(&ts.tv_sec); /* Note that ctime() isn't thread-safe. */ 
    p[strcspn(p, "\r\n")] = 0; 

    printf("Date: %s %ldns\n", p, ts.tv_nsec); 

    ... 
} 

the relevant documentation에서 :

모든 구현은 CLOCK_REALTIME에 의해 식별되는 시스템 전체의 실시간 클럭을 지원한다. 시간은 초를 나타내며 Epoch 이후로는 나노 초를 나타냅니다.

(POSIX documentation is here.)

+0

이것은 "Jan 1 23:28:20 1970 690758173ns "결과를 출력합니다. "date"명령의 결과로 "Tue Nov 14 10:59:57 UTC 2017"명령이 출력됩니다. 두 날짜의 시간 값이 다르다는 것을 알 수 있습니다 (형식은 잊어 버리십시오). – Irfan

+0

이것은 ts 변수에 시간이 있다는 사실 때문입니다. ctime은 단지 문자열로 입력 된 시간을 반환합니다. – Irfan

+0

@Irfan : 위의 코드가 실제로 "* Thu Jan 1 23:28:20 1970 ... *"로 표시되면 시스템 시계가 엉망이되어 잘못된 시간에 실행되는 것으로 보입니다. – alk

3

time_t 입력 갖는다 clock_gettime, ts.tv_sec를 호출 한 후, 에포크 초 소인 채워져있다./두 번째 년/월/일 /시/분으로 나누어 시간을 가진 struct tm

struct timespec ts;  
clock_gettime(clk_id, &ts); 
struct tm *my_tm = localtime(&ts.tv_sec); 

이제 my_tm 점, 그리고 ts.tv_nsec는 나노초 부분이있다 : 당신은 localtime 고객에게 직접 전달할 수 있습니다.

+0

broken time의'tm_year'과'tm_mon' 필드는 oddball 인코딩을 가지고 있고,'strftime()'은 시간 문자열을 포맷하는데 사용될 수 있습니다 (단 nanoseconds는 별도로 그리고 조심스럽게 다루어야 만합니다). –