Отформатируйте posix-время всего за 3 цифры за доли секунды

Что эквивалентно microsec_clock на миллисекунды в следующем коде?

#include <boost/date_time/posix_time/posix_time.hpp>

int main()
{
boost::posix_time::ptime date_time = boost::posix_time::microsec_clock::local_time();
const std::string str_time = boost::posix_time::to_simple_string(date_time);
std::cout << str_time << std::endl;
return 0;
}

выходной: 2015-январь-25 16: 26: 14.932738

Мне нужен следующий вывод:

выходной: 2015-январь-25 16: 26: 14,932

1

Решение

Действительно, это кажется странным упущением из библиотеки.

Опять же, это не выглядит strftime имеет товар: http://en.cppreference.com/w/cpp/chrono/c/strftime

Итак, что нужно для исправления time_facet реализация, чтобы получить это? Вот пластырь против повышения 1,57 boost::date_time::time_facet.hpp (прикладная).

1d0
<
39a39
>       static const char_type fractional_seconds_3digits[3];              // 3
72a73,76
>   time_formats<CharT>::fractional_seconds_3digits[3] = {'%','3'};
>
>   template <class CharT>
>   const typename time_formats<CharT>::char_type
215a220
>     static const char_type* fractional_seconds_3digits;               // %3
397a403,411
>       if (local_format.find(fractional_seconds_3digits) != string_type::npos) {
>         // replace %3 with nnn
>         if (frac_str.empty()) {
>           frac_str = fractional_seconds_as_3digit_string(time_arg.time_of_day(), false);
>         }
>         boost::algorithm::replace_all(local_format,
>                                       fractional_seconds_3digits,
>                                       frac_str);
>       }
506a521,529
>       if (format.find(fractional_seconds_3digits) != string_type::npos) {
>         // replace %3 with nnn
>         if (frac_str.empty()) {
>           frac_str = fractional_seconds_as_3digit_string(time_dur_arg, false);
>         }
>         boost::algorithm::replace_all(format,
>                                       fractional_seconds_3digits,
>                                       frac_str);
>       }
550a574,592
>     fractional_seconds_as_3digit_string(const time_duration_type& time_arg,
>                                  bool null_when_zero)
>     {
>       typename time_duration_type::fractional_seconds_type frac_sec =
>         time_arg.fractional_seconds();
>
>       for (auto n = time_arg.num_fractional_digits(); n>3; --n)
>           frac_sec /= 10;
>
>       if (null_when_zero && (frac_sec == 0)) {
>         return string_type();
>       }
>
>       //make sure there is no sign
>       return integral_as_string(date_time::absolute_value(frac_sec), 3);
>     }
>
>     static
>     string_type
599a642,645
>
>   template <class time_type, class CharT, class OutItrT>
>   const typename time_facet<time_type, CharT, OutItrT>::char_type*
>   time_facet<time_type, CharT, OutItrT>::fractional_seconds_3digits = time_formats<CharT>::fractional_seconds_3digits;

Теперь вы можете просто использовать Boost DateTime’s time_facet за ptimes:

#include "time_facet.hpp"#include <boost/date_time/posix_time/posix_time.hpp>

int main()
{
using namespace boost::posix_time;
ptime const date_time = microsec_clock::local_time();

std::cout << date_time << std::endl;

auto facet = new time_facet("%Y-%b-%d %H:%M:%S.%f %z");
std::cout.imbue(std::locale(std::cout.getloc(), facet));
std::cout << date_time << std::endl;

facet = new time_facet("%Y-%b-%d %H:%M:%S.%3 %z");
std::cout.imbue(std::locale(std::cout.getloc(), facet));
std::cout << date_time << std::endl;
}

Какие отпечатки

2015-Jan-25 22:32:30.392108
2015-Jan-25 22:32:30.392108
2015-Jan-25 22:32:30.392

Теперь это грубый патч, просто чтобы показать, что вам нужно сделать, если бы вы добавили это. Соответствующие улучшения, как представляется:

  • поддержка строки формата, которая позволяет различное количество цифр в доли секунды
  • используйте правильное округление (вместо усечения, что происходит сейчас)

Я надеюсь, что этот образец помогает.

2

Другие решения


По вопросам рекламы [email protected]