24小时时间格式

时间:2014-04-03 14:56:24

标签: c strptime

我正在读C程序中的json。我收到一个这样的字符串:

Apr 3, 2014 4:44:39 PM

我正在用strptime解析它以获得所有这样的值:

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

我还尝试使用%r代替%p。在observationDate中,我有一个包含字符串格式的日期的字符串。结果是一个struct tm。

但是,即使在第一个字符串中获取PM,当我尝试在转换后打印日期时,我得到4而不是16.I这样打印,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);

1 个答案:

答案 0 :(得分:2)

使用%r %I:%M:%S %p(请注意I而不是H)。

来自man strptime(我强调):

  

%R
  12小时制时间(使用区域设置的AM或PM)。在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)