2014-04-03 294 views
0

我正在閱讀C程序中的json。我收到一個字符串是這樣的:24小時時間格式

Apr 3, 2014 4:44:39 PM 

我與strptime解析它來獲取所有的值是這樣的:

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

%r代替%p也試過。在observationDate中,我有包含字符串格式的日期的字符串。結果是一個結構tm。

但是,即使在第一個字符串中獲取PM,當我嘗試在轉換後打印日期時,我得到4而不是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(注意這是IH)。

man strptime(由我強調):

%R
的12小時制時間(使用語言環境的上午或下午)。在POSIX語言環境相當於%I:%M:%S%p

的經驗教訓在這裏: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小時制時間。我想要24,因爲在PM上,我想收到16或17例如 – Biribu

+0

'strptime()'分析輸入字符串。因爲你在輸入時得到12h的時間格式,所以使用正確的格式說明符來獲得你所得到的內容,即上午12點/下午。那麼'struct tm'會被正確設置。 – alk

+0

是的,你是對的。我正在使用錯誤的參數讀取數據。我無法理解它是如何工作的。 – Biribu

相關問題