格式化POSIX时间在零点几秒,短短3个数字 [英] Format a posix time with just 3 digits in fractional seconds
问题描述
什么是 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;
}
输出:2015年一月25 16:26:14.932738
块引用>我需要以下的输出:
输出:2015年一月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/strftimeSo, what would it take to patch the
time_facet
implementation to get this? Here's the patch against boost 1.57'sboost::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
forptime
s:#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屋!