提升日期添加一天,非标准GMT字符串

时间:2009-06-30 02:18:41

标签: c++ date

在C ++中,以这种格式将日期添加到日期的最简单方法是什么:

“20090629-05:57:43”

可能使用Boost 1.36 - Boost::dateBoost::posix_date或任何其他提升或std库功能,我对其他库不感兴趣。

到目前为止,我提出了:

  • 将字符串格式化(将日期和时间部分分割为字符串op)以便能够初始化boost::gregorian::date,日期需要格式如下:

    “2009-06-29 05:57:43”

    我有

    “20090629-05:57:43”

  • 添加一天(提升date_duration内容)

  • 转换回to_simple_string并附加时间部分(字符串操作)

有没有更容易/更轻松的方法呢?

我正在考虑运行时效率。

上述步骤的示例代码:

using namespace boost::gregorian;
string orig("20090629-05:57:43");
string dday(orig.substr(0,8));
string dtime(orig.substr(8));

date d(from_undelimited_string(dday));
date_duration dd(1);
d += dd;
string result(to_iso_string(d) + dtime);

结果:

20090630-05:57:43

1 个答案:

答案 0 :(得分:1)

这非常接近我所知道的最简单的方法。关于进一步简化它的唯一方法是使用facet作为I / O的东西,以消除字符串操作的需要:

#include <iostream>
#include <sstream>
#include <locale>
#include <boost/date_time.hpp>

using namespace boost::local_time;

int main() {
    std::stringstream ss;
    local_time_facet* output_facet = new local_time_facet();
    local_time_input_facet* input_facet = new local_time_input_facet();
    ss.imbue(std::locale(std::locale::classic(), output_facet));
    ss.imbue(std::locale(ss.getloc(), input_facet));

    local_date_time ldt(not_a_date_time);

    input_facet->format("%Y%m%d-%H:%M:%S");
    ss.str("20090629-05:57:43");
    ss >> ldt;

    output_facet->format("%Y%m%d-%H:%M:%S");
    ss.str(std::string());
    ss << ldt;

    std::cout << ss.str() << std::endl;
}

然而,这更长,也可能更难理解。我没有试图证明这一点,但我怀疑这将是相同的运行时效率。