格式化POSIX时间在零点几秒,短短3个数字 [英] Format a posix time with just 3 digits in fractional seconds

查看:213
本文介绍了格式化POSIX时间在零点几秒,短短3个数字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

什么是 microsec_clock 的在以下code?

毫秒,相当于

 的#include<升压/ DATE_TIME /了posix_time / posix_time.hpp>诠释的main()
{
    提高::了posix_time ::分组时间DATE_TIME =提振::了posix_time :: microsec_clock :: LOCAL_TIME();
    常量标准::字符串str_time =提振::了posix_time :: to_simple_string(DATE_TIME);
    性病::法院LT&;< str_time<<的std :: ENDL;
    返回0;
}


  

输出:20​​15年一月25 16:26:14.932738


我需要以下的输出:


  

输出:20​​15年一月25 16:26:14.932



解决方案

事实上,这似乎从库中一个奇怪的遗漏。

话又说回来,它看起来并不认为的strftime 有货:的 HTTP://en.cp$p$pference.com/w/cpp/chrono/c/strftime

那么,什么将它带到修补 time_facet 的实施得到这个?下面是针对提升1.57的的boost :: date_time的:: time_facet的补丁。 HPP 应用)。

  1D0
<
39a39
>静态常量char_type fractional_seconds_3digits [3]; // 3
72a73,76
> time_formats<&图表GT; :: fractional_seconds_3digits [3] = {'%','3'};
>
>模板<类图>
>常量类型名time_formats<&图表GT; :: char_type
215a220
>静态常量char_type * fractional_seconds_3digits; // 3%
397a403,411
>如果(local_format.find(fractional_seconds_3digits)!= STRING_TYPE ::非营利组织){
> //使用NNN替换3%
>如果(frac_str.empty()){
> frac_str = fractional_seconds_as_3digit_string(time_arg.time_of_day(),FALSE);
> }
>提高::算法:: replace_all(local_format,
> fractional_seconds_3digits,
> frac_str);
> }
506a521,529
>如果(format.find(fractional_seconds_3digits)!= STRING_TYPE ::非营利组织){
> //使用NNN替换3%
>如果(frac_str.empty()){
> frac_str = fractional_seconds_as_3digit_string(time_dur_arg,FALSE);
> }
>提高::算法:: replace_all(格式,
> fractional_seconds_3digits,
> frac_str);
> }
550a574,592
> fractional_seconds_as_3digit_string(常量time_duration_type&放大器; time_arg,
>布尔null_when_zero)
> {
>类型名time_duration_type :: fractional_seconds_type frac_sec =
> time_arg.fractional_seconds();
>
>为(自动N = time_arg.num_fractional_digits(); N→3; --N)
> frac_sec / = 10;
>
>如果(null_when_zero&放大器;及(frac_sec == 0)){
>返回STRING_TYPE();
> }
>
> //确保没有任何迹象
>返回integral_as_string(DATE_TIME :: absolute_value(frac_sec),3);
> }
>
>静态的
> STRING_TYPE
599a642,645
>
>模板<类time_type,类图,类OutItrT>
>常量类型名time_facet< time_type,图表OutItrT> :: char_type *
> time_facet< time_type,图表OutItrT> :: fractional_seconds_3digits = time_formats<&图表GT; :: fractional_seconds_3digits;

现在你可以使用升压日期时间的 time_facet 分组时间取值:

 的#includetime_facet.hpp
#包括LT&;升压/ DATE_TIME /了posix_time / posix_time.hpp>诠释的main()
{
    使用空间boost ::了posix_time;
    分组时间常数DATE_TIME = microsec_clock :: LOCAL_TIME();    性病::法院LT&;< DATE_TIME<<的std :: ENDL;    汽车方面=新time_facet(%Y-%B-%D%H:%M:%S.%F%Z);
    的std :: cout.imbue(性病::区域设置(标准:: cout.getloc(),面));
    性病::法院LT&;< DATE_TIME<<的std :: ENDL;    面=新time_facet(%Y-%B-%D%H:%M:%S.%3%Z);
    的std :: cout.imbue(性病::区域设置(标准:: cout.getloc(),面));
    性病::法院LT&;< DATE_TIME<<的std :: ENDL;
}

它打印

  2015年一月25 22:32:30.392108
2015年一月25 22:32:30.392108
2015年一月25 22:32:30.392

现在,这是一个粗略的补丁,只是为了显示你需要那些事,当且仅当你要添加此。有关改进似乎是:


  • 支持格式字符串,允许数字不同号码的小数秒

  • 使用适当的四舍五入(而不是截断,现在发生了什么)

我希望这有助于样品

What's the equivalent of microsec_clock for milliseconds in the following code?

#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

I need the following output:

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

解决方案

Indeed, this seems a strange omission from the library.

Then again, it doesn't look that strftime has the goods: http://en.cppreference.com/w/cpp/chrono/c/strftime

So, what would it take to patch the time_facet implementation to get this? Here's the patch against boost 1.57's 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;

Now you can just use Boost DateTime's time_facet for 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;
}

Which prints

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

Now this is a rough patch, just to show what you'd need to get done iff you were to add this. The relevant improvements would seem to be:

  • support a format string that allows different numbers of digits in the fractional seconds
  • use proper rounding (instead of truncating, what happens now)

I hope this sample helps.

这篇关于格式化POSIX时间在零点几秒,短短3个数字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆