1// io_ex1.cpp ----------------------------------------------------------//
2
3// Copyright 2010 Howard Hinnant
4// Copyright 2010 Vicente J. Botet Escriba
5
6// Distributed under the Boost Software License, Version 1.0.
7// See http://www.boost.org/LICENSE_1_0.txt
8
9/*
10This code was adapted by Vicente J. Botet Escriba from Hinnant's html documentation.
11Many thanks to Howard for making his code available under the Boost license.
12
13*/
14
15#include <boost/chrono/chrono_io.hpp>
16#include <ostream>
17#include <iostream>
18
19// format duration as [-]d/hh::mm::ss.cc
20template <class CharT, class Traits, class Rep, class Period>
21std::basic_ostream<CharT, Traits>&
22display(std::basic_ostream<CharT, Traits>& os,
23 boost::chrono::duration<Rep, Period> d)
24{
25 using std::cout;
26 using namespace boost;
27 using namespace boost::chrono;
28
29 typedef duration<long long, ratio<86400> > days;
30 typedef duration<long long, centi> centiseconds;
31
32 // if negative, print negative sign and negate
33 if (d < duration<Rep, Period>(0))
34 {
35 d = -d;
36 os << '-';
37 }
38 // round d to nearest centiseconds, to even on tie
39 centiseconds cs = duration_cast<centiseconds>(d);
40 if (d - cs > milliseconds(5)
41 || (d - cs == milliseconds(5) && cs.count() & 1))
42 ++cs;
43 // separate seconds from centiseconds
44 seconds s = duration_cast<seconds>(fd: cs);
45 cs -= s;
46 // separate minutes from seconds
47 minutes m = duration_cast<minutes>(fd: s);
48 s -= m;
49 // separate hours from minutes
50 hours h = duration_cast<hours>(fd: m);
51 m -= h;
52 // separate days from hours
53 days dy = duration_cast<days>(fd: h);
54 h -= dy;
55 // print d/hh:mm:ss.cc
56 os << dy.count() << '/';
57 if (h < hours(10))
58 os << '0';
59 os << h.count() << ':';
60 if (m < minutes(10))
61 os << '0';
62 os << m.count() << ':';
63 if (s < seconds(10))
64 os << '0';
65 os << s.count() << '.';
66 if (cs < centiseconds(10))
67 os << '0';
68 os << cs.count();
69 return os;
70}
71
72int main()
73{
74 using std::cout;
75 using namespace boost;
76 using namespace boost::chrono;
77
78#ifdef BOOST_CHRONO_HAS_CLOCK_STEADY
79 display(os&: cout, d: steady_clock::now().time_since_epoch()
80 + duration<long, mega>(1)) << '\n';
81#endif
82 display(os&: cout, d: -milliseconds(6)) << '\n';
83 display(os&: cout, d: duration<long, mega>(1)) << '\n';
84 display(os&: cout, d: -duration<long, mega>(1)) << '\n';
85}
86
87//~ 12/06:03:22.95
88//~ -0/00:00:00.01
89//~ 11/13:46:40.00
90//~ -11/13:46:40.00
91

source code of boost/libs/chrono/example/io_ex5.cpp