ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c-以小数秒形式仅用3位数字格式化posix时间

2019-10-12 09:08:39  阅读:235  来源: 互联网

标签:c time boost datetime-format time-format


以下代码中毫秒等于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;
}

output: 2015-Jan-25 16:26:14.932738

我需要以下输出:

output: 2015-Jan-25 16:26:14.932

解决方法:

确实,这似乎是图书馆的一个奇怪疏漏.

再说一遍,看起来strftime没货了:http://en.cppreference.com/w/cpp/chrono/c/strftime

那么,如何修补time_facet实现以实现此目标呢?这是patch对1.57的boost :: date_time :: time_facet.hpp(applied)的反对.

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的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

现在,这是一个粗略的补丁程序,只是为了展示您要添加的内容需要完成的工作.相关的改进似乎是:

>支持格式字符串,该格式字符串允许在小数秒内显示不同数量的数字
>使用适当的舍入(而不是截断,现在会发生什么)

希望本示例对您有所帮助.

标签:c,time,boost,datetime-format,time-format
来源: https://codeday.me/bug/20191012/1899076.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有