【问题标题】:C++ Boost posix time fails parsingC ++ Boost posix时间解析失败
【发布时间】:2016-10-01 22:06:32
【问题描述】:

感谢为此做出贡献的人question

我对其进行了一些修改,以灵活的自定义格式将字符串转换为纪元时间。

我不明白为什么我的格式 "%m/%d/%Y %H:%M:%S" 失败但另一种格式 %Y/%m/%d %H:%M:%S 有效。我该如何解决?

#include <iostream>
#include <boost/date_time.hpp>
namespace bt = boost::posix_time;

std::time_t pt_to_time_t(const bt::ptime& pt)
{
    bt::ptime timet_start(boost::gregorian::date(1970,1,1));
    bt::time_duration diff = pt - timet_start;
    return diff.ticks()/bt::time_duration::rep_type::ticks_per_second;
}
void seconds_from_epoch(const std::string& s,const std::string format_string)
{
    const std::locale format = std::locale(std::locale::classic(),new bt::time_input_facet(format_string));
    bt::ptime pt;
    std::istringstream is(s);
    is.imbue(format);
    is >> pt;
    // if(pt != bt::ptime())
    //     break;
    std::cout << " ptime is " << pt << '\n';
    std::cout << " seconds from epoch are " << pt_to_time_t(pt) << '\n';
}
int main()
{
    seconds_from_epoch("7/23/2012 4:10:43","%m/%d/%Y %H:%M:%S");
    seconds_from_epoch("2004/03/21 12:45:33","%Y/%m/%d %H:%M:%S");
}

结果:

g++ main.cpp -Wall -Wconversion -Wfatal-errors -Wextra -std=c++11 -o main
./main
 ptime is not-a-date-time
 seconds from epoch are 9223372036854
 ptime is 2004-Mar-21 12:45:33
 seconds from epoch are 1079873133

【问题讨论】:

    标签: c++ datetime boost epoch


    【解决方案1】:

    引用doc:

    %H 小时,使用 24 小时制(范围为 00 到 23)的十进制数。

    所以换行

    seconds_from_epoch("7/23/2012 4:10:43","%m/%d/%Y %H:%M:%S");
    

    seconds_from_epoch("7/23/2012 04:10:43","%m/%d/%Y %H:%M:%S"); // 4:10 => 04:10
    

    然后就可以了。

    [更新:]这里的问题与格式说明符的顺序无关,但%H说明符的有效值应该在0023的范围内。

    【讨论】:

    • 谢谢,但如果我不想更改第一个字符串怎么办?如何通过更改其余代码来修复它?
    • “更改其余代码”是什么意思?该问题与格式说明符的顺序无关,但说明符%H 的值应在0023 的范围内。
    • 但是用户也喜欢用一位数来表示小时。例如4。我不能强迫他们输入04
    • 其实我不用scanf。我从一个文件中读取。日期被读入字符串。有没有办法不破解函数的输入?
    【解决方案2】:

    如果您对日期库比较灵活,可以使用this one。这将使您的示例看起来像:

    #include "tz.h"
    #include <iostream>
    #include <sstream>
    
    void
    seconds_from_epoch(const std::string& s,const std::string format_string)
    {
        std::istringstream is(s);
        is.exceptions(std::ios::failbit);
        date::sys_seconds pt;
        date::parse(is, format_string, pt);
        using namespace date;
        std::cout << " ptime is " << pt << '\n';
        std::cout << " seconds from epoch are " << pt.time_since_epoch().count() << '\n';
    }
    
    int
    main()
    {
        seconds_from_epoch("7/23/2012 4:10:43","%m/%d/%Y %H:%M:%S");
        seconds_from_epoch("2004/03/21 12:45:33","%Y/%m/%d %H:%M:%S");
    }
    
     ptime is 2012-07-23 04:10:43
     seconds from epoch are 1343016643
     ptime is 2004-03-21 12:45:33
     seconds from epoch are 1079873133
    

    这将允许您在 C++ &lt;chrono&gt; 时间系统中工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多