2011-08-18 5 views

답변

6

날짜 형식은 같은 문자열을 제공 RFC3339의 엄격한 버전 '2011-08-18T23는 : 31 : 42Z'에서

나는 strptime 기능이 시간대 지정자를 해결할 수있는 확실하지 않다 (Z 위의 시간 문자열), 그래서 당신 자신의 함수 안에서 그것을 다루기가 더 쉬울 수도 있습니다. struct tm이 그들을 처리하지 않기 때문에 분수 초를 처리 할 수 ​​없습니다. 필요할 경우 struct timespec을 사용하여 소수 초를 저장할 수 있습니다.

당신은 strptime를 사용하여 형식의 대부분을 구문 분석 할 수 있습니다 :이 다음

struct tm tm; 
time_t t 
char *extra; 
extra = strptime(tmstr, "%C%y-%m-%dT%H:%M:%S", &tm); 
tm.tm_isdst = -1; 
t = mktime(&tm); 

는, 추가 입력 tmstr의 나머지 될 것입니다. 이것은 소수 초를 포함 할 수 있으며 시간대 형식을 포함합니다. 여분이 '.' 단지 strtod 기능 수를 구문 분석 :

if(extra && extra[0] == '.') 
{ 
    char *endptr; 
    fraction = strtod(extra, &endptr); 
    extra = endptr; 

    /* use timespec if fractional seconds required */ 
    struct timespec ts; 
    ts.tv_sec = t; 
    ts.tv_nsec = fraction * 1000000000; 
} 

그런 다음 추가 지금 바로 시간대 지정자를 포함합니다. 'Z'이면 mktime이 UTC 시간을 제공하기 때문에 완료되었습니다. 그렇지 않으면 오프셋이 표시됩니다. +03 : 00이므로 시간/분 단위로 시간을 수정해야합니다.

+0

고맙습니다. 이것은 완벽 해. 난'time_t'으로 유지하는 시간에'+03 : 00'을 추가하는 방법을 알아야합니다. – hari

+0

알겠습니다. 나는 진심으로 당신의 도움에 감사드립니다. – hari

+2

'struct timespec'은'double'보다 타임 스탬프를 저장하는 더 좋은 방법입니다. 후자는 시간이 흐르면서 정밀도를 잃어 버리고 일부 기본 2 분수 형식이 아닌 거의 확실하게 마이크로 초 또는 나노초 단위의 "원래 값"을 정확히 표현할 수 없습니다. –