Дата повышения добавить один день, нестандартная строка GMT - PullRequest
1 голос
/ 30 июня 2009

В C ++, какой самый простой способ добавить один день к дате в этом формате:

"20090629-05: 57: 43"

Возможно, с использованием Boost 1.36 - Boost::date, Boost::posix_date или любой другой функциональности библиотеки boost или 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 Ответ

1 голос
/ 30 июня 2009

Это довольно близко к самому простому из известных мне методов. Единственный способ еще больше упростить его - использовать фасеты для ввода-вывода, чтобы исключить необходимость манипулирования строками:

#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;
}

Это длиннее, и, возможно, труднее для понимания. Я не пытался это доказать, но я подозреваю, что таким образом эффективность будет примерно одинаковой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...