2014-04-03 2 views
0

C 프로그램에서 json을 읽습니다. 나는이 같은 문자열을받을 : 나는 strptime로 구문 분석하고24 시간제 형식

Apr 3, 2014 4:44:39 PM 

것은이 같은 모든 값을 얻을 :

strptime(observationDate, "%b %d, %Y %H:%M:%S %p", &result); 

나는 %r 대신 %p으로도했습니다. observationDate에서 문자열 형식의 날짜를 포함하는 문자열을가집니다. result는 struct tm입니다.

그러나 첫 번째 문자열에서 PM을 얻는 경우에도 변환 후 날짜를 인쇄하려고 할 때 16 대신 16이 인쇄됩니다. debugLog는 텍스트 앞에 시스템 날짜를 인쇄하는 함수입니다 ...

debugLog(DEB_INFO, "observationDateConverted: %d-%d-%d %d:%d:%d\n", 
        result.tm_year+1900, 
        result.tm_mon + 1, 
        result.tm_mday, 
        result.tm_hour, 
        result.tm_min, 
        result.tm_sec); 

답변

2

하나는 %r또는%I:%M:%S %p이 (가 I하지 H의주의)를 사용합니다.

man strptime (내게로 강조)에서 :

퍼센트의 R
12 시간 시계 (로케일의 AM 또는 PM을 사용). % I : % M : % S % p과 같은 POSIX 로케일 에 있습니다. RTFM!

테스트 프로그램 :

#define _XOPEN_SOURCE 

#include <time.h> 

const char d[] = "Apr 3, 2014 4:44:39 PM"; 

int main(void) 
{ 
    struct tm t = { 0 }; 

    strptime(d, "%b %d, %Y %I:%M:%S %p", &t); 
} 

결과를 확인 :

는 교훈은 여기에서 배운

$gdb ./main 
[...] 
b 12 
r 
Breakpoint 1, main() at main.c:12 
12 } 
(gdb) p t 
$2 = {tm_sec = 39, tm_min = 44, tm_hour = 16, tm_mday = 3, tm_mon = 3, tm_year = 114, tm_wday = 4, tm_yday = 92, tm_isdst = 0, __tm_gmtoff = 0, __tm_zone = 0x0} 
(gdb) 
+0

을하지만 12 시간 시계를 원하지 않습니다. 오후에 PM이 16이나 17을 받고 싶기 때문에 24를 원합니다. – Biribu

+0

'strptime()'이 입력 문자열을 구문 분석합니다. 입력시 12 시간 형식을 사용하므로 올바른 형식 지정자를 사용하십시오. 이는 오전 12시/오후입니다. 'struct tm'은 그런 다음 정확하게 설정 될 것입니다. – alk

+0

네 말이 맞았다. 잘못된 매개 변수를 사용하여 데이터를 읽었습니다. 나는 그것이 어떻게 작동하는지 이해하지 못한다. – Biribu