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++ 中的日期/时间解析的主要内容,如果未能解决你的问题,请参考以下文章

将日期和时间字符串解析为数字以比较 C++

在 Windows C++ 中将字符串解析为日期的区域感知

请问,在C++中怎样将一个LONGLONG型转换(或解析)为一个日期型?

Ruby 中的日期时间解析

C++ 控制台:解析 METAR 数据

将 txt 文件中的日期解析为整数