1 #ifndef ISO_FORMAT_HPP___ 2 #define ISO_FORMAT_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/parse_format_base.hpp" 13 14 namespace boost { 15 namespace date_time { 16 17 //! Class to provide common iso formatting spec 18 template<class charT> 19 class iso_format_base { 20 public: 21 //! Describe month format -- its an integer in iso format month_format()22 static month_format_spec month_format() 23 { 24 return month_as_integer; 25 } 26 27 //! String used printed is date is invalid not_a_date()28 static const charT* not_a_date() 29 { 30 return "not-a-date-time"; 31 } 32 //! String used to for positive infinity value pos_infinity()33 static const charT* pos_infinity() 34 { 35 return "+infinity"; 36 } 37 //! String used to for positive infinity value neg_infinity()38 static const charT* neg_infinity() 39 { 40 return "-infinity"; 41 } 42 43 //! ISO char for a year -- used in durations year_sep_char()44 static charT year_sep_char() 45 { 46 return 'Y'; 47 } 48 //! ISO char for a month month_sep_char()49 static charT month_sep_char() 50 { 51 return '-'; 52 } 53 //! ISO char for a day day_sep_char()54 static charT day_sep_char() 55 { 56 return '-'; 57 } 58 //! char for minute hour_sep_char()59 static charT hour_sep_char() 60 { 61 return ':'; 62 } 63 //! char for minute minute_sep_char()64 static charT minute_sep_char() 65 { 66 return ':'; 67 } 68 //! char for second second_sep_char()69 static charT second_sep_char() 70 { 71 return ':'; 72 } 73 //! ISO char for a period period_start_char()74 static charT period_start_char() 75 { 76 return 'P'; 77 } 78 //! Used in time in mixed strings to set start of time time_start_char()79 static charT time_start_char() 80 { 81 return 'T'; 82 } 83 84 //! Used in mixed strings to identify start of a week number week_start_char()85 static charT week_start_char() 86 { 87 return 'W'; 88 } 89 90 //! Separators for periods period_sep_char()91 static charT period_sep_char() 92 { 93 return '/'; 94 } 95 //! Separator for hh:mm:ss time_sep_char()96 static charT time_sep_char() 97 { 98 return ':'; 99 } 100 //! Preferred Separator for hh:mm:ss,decimal_fraction fractional_time_sep_char()101 static charT fractional_time_sep_char() 102 { 103 return ','; 104 } 105 is_component_sep(charT sep)106 static bool is_component_sep(charT sep) 107 { 108 switch(sep) { 109 case 'H': 110 case 'M': 111 case 'S': 112 case 'W': 113 case 'T': 114 case 'Y': 115 case 'D':return true; 116 default: 117 return false; 118 } 119 } 120 is_fractional_time_sep(charT sep)121 static bool is_fractional_time_sep(charT sep) 122 { 123 switch(sep) { 124 case ',': 125 case '.': return true; 126 default: return false; 127 } 128 } is_timezone_sep(charT sep)129 static bool is_timezone_sep(charT sep) 130 { 131 switch(sep) { 132 case '+': 133 case '-': return true; 134 default: return false; 135 } 136 } element_sep_char()137 static charT element_sep_char() 138 { 139 return '-'; 140 } 141 142 }; 143 144 #ifndef BOOST_NO_STD_WSTRING 145 146 //! Class to provide common iso formatting spec 147 template<> 148 class iso_format_base<wchar_t> { 149 public: 150 //! Describe month format -- its an integer in iso format month_format()151 static month_format_spec month_format() 152 { 153 return month_as_integer; 154 } 155 156 //! String used printed is date is invalid not_a_date()157 static const wchar_t* not_a_date() 158 { 159 return L"not-a-date-time"; 160 } 161 //! String used to for positive infinity value pos_infinity()162 static const wchar_t* pos_infinity() 163 { 164 return L"+infinity"; 165 } 166 //! String used to for positive infinity value neg_infinity()167 static const wchar_t* neg_infinity() 168 { 169 return L"-infinity"; 170 } 171 172 //! ISO char for a year -- used in durations year_sep_char()173 static wchar_t year_sep_char() 174 { 175 return 'Y'; 176 } 177 //! ISO char for a month month_sep_char()178 static wchar_t month_sep_char() 179 { 180 return '-'; 181 } 182 //! ISO char for a day day_sep_char()183 static wchar_t day_sep_char() 184 { 185 return '-'; 186 } 187 //! char for minute hour_sep_char()188 static wchar_t hour_sep_char() 189 { 190 return ':'; 191 } 192 //! char for minute minute_sep_char()193 static wchar_t minute_sep_char() 194 { 195 return ':'; 196 } 197 //! char for second second_sep_char()198 static wchar_t second_sep_char() 199 { 200 return ':'; 201 } 202 //! ISO char for a period period_start_char()203 static wchar_t period_start_char() 204 { 205 return 'P'; 206 } 207 //! Used in time in mixed strings to set start of time time_start_char()208 static wchar_t time_start_char() 209 { 210 return 'T'; 211 } 212 213 //! Used in mixed strings to identify start of a week number week_start_char()214 static wchar_t week_start_char() 215 { 216 return 'W'; 217 } 218 219 //! Separators for periods period_sep_char()220 static wchar_t period_sep_char() 221 { 222 return '/'; 223 } 224 //! Separator for hh:mm:ss time_sep_char()225 static wchar_t time_sep_char() 226 { 227 return ':'; 228 } 229 //! Preferred Separator for hh:mm:ss,decimal_fraction fractional_time_sep_char()230 static wchar_t fractional_time_sep_char() 231 { 232 return ','; 233 } 234 is_component_sep(wchar_t sep)235 static bool is_component_sep(wchar_t sep) 236 { 237 switch(sep) { 238 case 'H': 239 case 'M': 240 case 'S': 241 case 'W': 242 case 'T': 243 case 'Y': 244 case 'D':return true; 245 default: 246 return false; 247 } 248 } 249 is_fractional_time_sep(wchar_t sep)250 static bool is_fractional_time_sep(wchar_t sep) 251 { 252 switch(sep) { 253 case ',': 254 case '.': return true; 255 default: return false; 256 } 257 } is_timezone_sep(wchar_t sep)258 static bool is_timezone_sep(wchar_t sep) 259 { 260 switch(sep) { 261 case '+': 262 case '-': return true; 263 default: return false; 264 } 265 } element_sep_char()266 static wchar_t element_sep_char() 267 { 268 return '-'; 269 } 270 271 }; 272 273 #endif // BOOST_NO_STD_WSTRING 274 275 //! Format description for iso normal YYYYMMDD 276 template<class charT> 277 class iso_format : public iso_format_base<charT> { 278 public: 279 //! The ios standard format doesn't use char separators has_date_sep_chars()280 static bool has_date_sep_chars() 281 { 282 return false; 283 } 284 }; 285 286 //! Extended format uses seperators YYYY-MM-DD 287 template<class charT> 288 class iso_extended_format : public iso_format_base<charT> { 289 public: 290 //! Extended format needs char separators has_date_sep_chars()291 static bool has_date_sep_chars() 292 { 293 return true; 294 } 295 296 }; 297 298 } } //namespace date_time 299 300 301 302 303 #endif 304