C++ 中的日期/时间解析
Posted
技术标签:
【中文标题】C++ 中的日期/时间解析【英文标题】:Date/Time parsing in C++ 【发布时间】:2010-08-05 12:11:08 【问题描述】:在 c++ 中进行数据/时间解析(将任何格式的字符串转换为日期)时,我发现了以下有用的方法
1) strptime() - 这里的 %d、%m 等可以有 1 个或 2 个字符。该功能将负责这一点。因此,它将强制我们在两个转换说明符之间使用分隔符。例如:将 %d%m 提供给 %d/%m 或任何其他分隔符是无效的。这也不支持时区。
2) 提升日期 IO - 这里的 %d, %m 必须有 2 个字符。现在,我得到的输入字符串不能保证有这个。结果,它不可能成功地使用它。但是,这似乎确实支持时区,但不确定。因为它说对于输入它确实支持时区
所以我打算结合使用两者来确定日期。但我想得到一个我也可以考虑时区的地方。但似乎没有人支持这一点。
有人有什么建议吗? Rgds, 阿杰
【问题讨论】:
【参考方案1】:@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
【讨论】:
非常感谢!只是好奇,glibc 2.9.x 有可能吗?!你知道有没有?无论如何都会尝试,但目前无法访问linux机器。 当时区为 3 个字母格式(如 CST CDT 等)时是否解析? glibc 2.10.1 不支持命名时区。这就是信息页面的含义,“注意: 目前,这还没有完全实现。” 此外,时区名称的格式说明符将是 %Z,因此上面的 sn-p 仅限于数字偏移量。【参考方案2】:取决于 libc 版本,我会说,当然你所说的“考虑”是什么意思:它是否应该读取附加信息然后忽略它,它是否应该将解析的信息存储在tm 结构,还是要转换为系统/环境时间?
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.
【讨论】:
我是否可以将以下日期转换为 GMT 并在 tm 中包含这些值? 2008 年 2 月 19 日星期二 20:47:53 +0530 2009 年 4 月 28 日星期二 18:22:39 -0700(太平洋夏令时)或三个班轮)【参考方案3】:您注意到strptime
不直接支持时区。它所做的只是将格式化的无时区数据读入tm
结构。你必须自己解析一个可选的时区指示器(除非它是固定的),然后设置 TZ
并使用 mktime 转换为 time_t
。如果您将tm.is_dst
设置为-1,您甚至可以要求mktime
尝试自动为您计算夏令时。
您也可以使用 Steam 构建自己的解析器(boost 支持几种格式,但可能不够通用)。再次像上面一样,您可以使用mktime
组成time_t
。
【讨论】:
以上是关于C++ 中的日期/时间解析的主要内容,如果未能解决你的问题,请参考以下文章