【问题标题】:Date/Time parsing in C++C++ 中的日期/时间解析
【发布时间】:2010-08-05 12:11:08
【问题描述】:

在 c++ 中进行数据/时间解析(将任何格式的字符串转换为日期)时,我发现了以下有用的方法

1) strptime() - 这里的 %d、%m 等可以有 1 个或 2 个字符。该功能将负责这一点。因此,它将强制我们在两个转换说明符之间使用分隔符。例如:将 %d%m 提供给 %d/%m 或任何其他分隔符是无效的。这也不支持时区。

2) 提升日期 IO - 这里的 %d, %m 必须有 2 个字符。现在,我得到的输入字符串不能保证有这个。结果,它不可能成功地使用它。但是,这似乎确实支持时区,但不确定。因为它说对于输入它确实支持时区

所以我打算结合使用两者来确定日期。但我想得到一个我也可以考虑时区的地方。但似乎没有人支持这一点。

有人有什么建议吗? Rgds, 阿杰

【问题讨论】:

    标签: c++ datetime parsing boost


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-11
      • 2016-05-22
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      相关资源
      最近更新 更多