1 #ifndef POSIXTIME_FORMATTERS_LIMITED_HPP___
2 #define POSIXTIME_FORMATTERS_LIMITED_HPP___
3 
4 /* Copyright (c) 2002,2003 CrystalClear Software, Inc.
5  * Use, modification and distribution is subject to the
6  * Boost Software License, Version 1.0. (See accompanying
7  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
8  * Author: Jeff Garland, Bart Garst
9  * $Date$
10  */
11 
12 #include <boost/date_time/gregorian/gregorian.hpp>
13 #include <boost/date_time/compiler_config.hpp>
14 #include <boost/date_time/iso_format.hpp>
15 #include <boost/date_time/date_format_simple.hpp>
16 #include <boost/date_time/posix_time/posix_time_types.hpp>
17 #include <boost/date_time/time_formatting_streams.hpp>
18 #include <boost/date_time/time_resolution_traits.hpp> // absolute_value
19 
20 namespace boost {
21 
22 namespace posix_time {
23 
24   //! Time duration to string -hh::mm::ss.fffffff. Example: 10:09:03.0123456
25   /*!\ingroup time_format
26    */
to_simple_string(time_duration td)27   inline std::string to_simple_string(time_duration td) {
28     std::ostringstream ss;
29     if(td.is_special()) {
30       /* simply using 'ss << td.get_rep()' won't work on compilers
31        * that don't support locales. This way does. */
32       // switch copied from date_names_put.hpp
33       switch(td.get_rep().as_special())
34       {
35       case not_a_date_time:
36         //ss << "not-a-number";
37         ss << "not-a-date-time";
38         break;
39       case pos_infin:
40         ss << "+infinity";
41         break;
42       case neg_infin:
43         ss << "-infinity";
44         break;
45       default:
46         ss << "";
47       }
48     }
49     else {
50       if(td.is_negative()) {
51         ss << '-';
52       }
53       ss  << std::setw(2) << std::setfill('0')
54           << date_time::absolute_value(td.hours()) << ":";
55       ss  << std::setw(2) << std::setfill('0')
56           << date_time::absolute_value(td.minutes()) << ":";
57       ss  << std::setw(2) << std::setfill('0')
58           << date_time::absolute_value(td.seconds());
59       //TODO the following is totally non-generic, yelling FIXME
60 #if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
61       boost::int64_t frac_sec =
62         date_time::absolute_value(td.fractional_seconds());
63       // JDG [7/6/02 VC++ compatibility]
64       char buff[32];
65       _i64toa(frac_sec, buff, 10);
66 #else
67       time_duration::fractional_seconds_type frac_sec =
68         date_time::absolute_value(td.fractional_seconds());
69 #endif
70       if (frac_sec != 0) {
71         ss  << "." << std::setw(time_duration::num_fractional_digits())
72             << std::setfill('0')
73 
74           // JDG [7/6/02 VC++ compatibility]
75 #if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
76             << buff;
77 #else
78         << frac_sec;
79 #endif
80       }
81     }// else
82     return ss.str();
83   }
84 
85   //! Time duration in iso format -hhmmss,fffffff Example: 10:09:03,0123456
86   /*!\ingroup time_format
87    */
88   inline
89   std::string
to_iso_string(time_duration td)90   to_iso_string(time_duration td)
91   {
92     std::ostringstream ss;
93     if(td.is_special()) {
94       /* simply using 'ss << td.get_rep()' won't work on compilers
95        * that don't support locales. This way does. */
96       // switch copied from date_names_put.hpp
97       switch(td.get_rep().as_special()) {
98       case not_a_date_time:
99         //ss << "not-a-number";
100         ss << "not-a-date-time";
101         break;
102       case pos_infin:
103         ss << "+infinity";
104         break;
105       case neg_infin:
106         ss << "-infinity";
107         break;
108       default:
109         ss << "";
110       }
111     }
112     else {
113       if(td.is_negative()) {
114         ss << '-';
115       }
116       ss  << std::setw(2) << std::setfill('0')
117           << date_time::absolute_value(td.hours());
118       ss  << std::setw(2) << std::setfill('0')
119           << date_time::absolute_value(td.minutes());
120       ss  << std::setw(2) << std::setfill('0')
121           << date_time::absolute_value(td.seconds());
122       //TODO the following is totally non-generic, yelling FIXME
123 #if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
124       boost::int64_t frac_sec =
125         date_time::absolute_value(td.fractional_seconds());
126       // JDG [7/6/02 VC++ compatibility]
127       char buff[32];
128       _i64toa(frac_sec, buff, 10);
129 #else
130       time_duration::fractional_seconds_type frac_sec =
131         date_time::absolute_value(td.fractional_seconds());
132 #endif
133       if (frac_sec != 0) {
134         ss  << "." << std::setw(time_duration::num_fractional_digits())
135             << std::setfill('0')
136 
137           // JDG [7/6/02 VC++ compatibility]
138 #if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
139             << buff;
140 #else
141         << frac_sec;
142 #endif
143       }
144     }// else
145     return ss.str();
146   }
147 
148   //! Time to simple format CCYY-mmm-dd hh:mm:ss.fffffff
149   /*!\ingroup time_format
150    */
151   inline
152   std::string
to_simple_string(ptime t)153   to_simple_string(ptime t)
154   {
155     std::string ts = gregorian::to_simple_string(t.date());// + " ";
156     if(!t.time_of_day().is_special()) {
157       return ts + " " + to_simple_string(t.time_of_day());
158     }
159     else {
160       return ts;
161     }
162   }
163 
164   //! Convert to string of form [YYYY-mmm-DD HH:MM::SS.ffffff/YYYY-mmm-DD HH:MM::SS.fffffff]
165   /*!\ingroup time_format
166    */
167   inline
168   std::string
to_simple_string(time_period tp)169   to_simple_string(time_period tp)
170   {
171     std::string d1(to_simple_string(tp.begin()));
172     std::string d2(to_simple_string(tp.last()));
173     return std::string("[" + d1 + "/" + d2 +"]");
174   }
175 
176   //! Convert iso short form YYYYMMDDTHHMMSS where T is the date-time separator
177   /*!\ingroup time_format
178    */
179   inline
to_iso_string(ptime t)180   std::string to_iso_string(ptime t)
181   {
182     std::string ts = gregorian::to_iso_string(t.date());// + "T";
183     if(!t.time_of_day().is_special()) {
184       return ts + "T" + to_iso_string(t.time_of_day());
185     }
186     else {
187       return ts;
188     }
189   }
190 
191   //! Convert to form YYYY-MM-DDTHH:MM:SS where T is the date-time separator
192   /*!\ingroup time_format
193    */
194   inline
195   std::string
to_iso_extended_string(ptime t)196   to_iso_extended_string(ptime t)
197   {
198     std::string ts = gregorian::to_iso_extended_string(t.date());// + "T";
199     if(!t.time_of_day().is_special()) {
200       return ts + "T" + to_simple_string(t.time_of_day());
201     }
202     else {
203       return ts;
204     }
205   }
206 
207 
208 } } //namespace posix_time
209 
210 
211 #endif
212 
213