2014-04-03 327 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

相关问题