在c ++中进行数据/时间解析(将任何格式的字符串转换为日期)时,我发现了以下有用的方法
1)strptime() - 这里%d,%m等可以有1或2个字符。该功能将负责这一点。因此,它将强制我们在两个转换说明符之间使用分隔符。例如:无法给出%d%m,它必须是%d /%m或任何其他分隔符。这也不支持时区。
2)提升日期IO - 这里%d,%m必须有2个字符。现在,我得到的输入字符串不能保证这个。结果,它无法成功使用它。但是,这似乎支持时区,但不确定。因为它说输入它确实支持时区
所以我打算同时使用两者来确定日期。但我想得到一个我可以考虑时区的地方。但似乎没有人支持这一点。
有人有建议吗? RGDS, AJ
答案 0 :(得分:3)
@AJ:添加了另一个答案,以便代码格式化
#include <stdio.h>
#include <sys/time.h>
#include <time.h>
int
main(void)
{
struct tm tm[1] = {{0}};
strptime("Tue, 19 Feb 2008 20:47:53 +0530", "%a, %d %b %Y %H:%M:%S %z", tm);
fprintf(stdout, "off %ld\n", tm->tm_gmtoff);
return 0;
}
跑步看起来像(glibc 2.10.1):
freundt@clyde:pts/28:~/temp> ./test
off 19800
答案 1 :(得分:0)
取决于libc版本,我会说,当然你的意思是“考虑到”:是否应该读取其他信息然后忽略它,是否应该将解析后的信息存储在tm struct,还是意味着要转换为系统/环境时间?
glibc 2.10.1的strptime()从信息页面
执行时区`%z'
The offset from GMT in ISO 8601/RFC822 format.
`%Z'
The timezone name.
_Note:_ Currently, this is not fully implemented. The format
is recognized, input is consumed but no field in TM is set.
答案 2 :(得分:0)
如您所见strptime
支持时区。它只是将格式化的无时区数据读入tm
结构。您必须自己解析可选的时区指示符(除非它已修复),然后设置TZ
并使用mktime转换为time_t
。如果您将tm.is_dst
设置为-1,您甚至可以要求mktime
尝试自动为您找出DST。
或者你可以使用steams构建自己的解析器(boost支持几种格式,但可能不够通用)。如上所述,您可以使用mktime
撰写time_t
。