Changeset 550 for XIOS/trunk/src/calendar.cpp
- Timestamp:
- 02/10/15 14:23:02 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/calendar.cpp
r549 r550 165 165 int CCalendar::getDayLengthInSeconds(void) const { return getDayLength() * getHourLength() * getMinuteLength(); } 166 166 167 bool CCalendar::hasLeapYear() const { return false; } 168 167 169 StdString CCalendar::getMonthName(int monthId) const 168 170 { … … 176 178 { StdString value = this->getMonthName(monthId); value.resize(3); return value; } 177 179 178 ///---------------------------------------------------------------- 179 180 CDuration& CCalendar::resolve(CDuration& dur, bool noNegativeTime /*= false*/) const 181 { 182 const int hourLengthInSeconds = getHourLength() * getMinuteLength(); 183 184 // Simplify the days, hours, minutes and seconds. 185 // First convert them to seconds 186 Time t = Time(modf(dur.day, &dur.day) * getDayLengthInSeconds() 187 + (dur.hour * getHourLength() + dur.minute) * getMinuteLength() + dur.second); 188 // Then convert back to days 189 dur.day += int(t / getDayLengthInSeconds()); 190 t %= getDayLengthInSeconds(); 191 192 // Do we allow hour, minute, second to be negative? 193 if (noNegativeTime) 194 { 195 // If we don't, we remove some days until the time is positive 196 while (t < 0) 197 { 198 t += getDayLengthInSeconds(); 199 dur.day -= 1.0; 200 } 201 } 202 203 // hours 204 dur.hour = int(t / hourLengthInSeconds); 205 t %= hourLengthInSeconds; 206 // minutes 207 dur.minute = int(t / getMinuteLength()); 208 // secondes 209 dur.second = int(t % getMinuteLength()); 210 211 // Nothing to do for the months yet since this depends on an actual date 212 213 // Simplify the years 214 dur.month += modf(dur.year, &dur.year) * getYearLength(); 215 dur.year += int(dur.month) / getYearLength(); dur.month = int(dur.month) % getYearLength(); 216 217 return dur; 218 } 219 220 /*! Parse a date using a generic parser. */ 221 void CCalendar::parseDateDefault(StdIStream& in, CDate& date) 222 { 223 char sep = '-'; // Le caractÚre c est utilisé pour "recueillir" les séparateurs "/" et ":". 224 char c; 225 226 // Default initialize the date 227 int year = 00, month = 01, day = 01; 228 int hour = 00, minute = 00, second = 00; 229 230 in >> year >> c; 231 if (c == sep) 232 { 233 in >> month >> c; 234 if (c == sep) 235 { 236 in >> day; 237 c = in.get(); 238 sep = ' '; 239 if (c == sep) 240 { 241 in >> hour >> c; 242 sep = ':'; 243 if (c == sep) 244 { 245 in >> minute >> c; 246 if (c == sep) 247 { 248 in >> second; 249 in >> c; 250 } 251 } 252 } 253 } 254 } 255 256 date.setDate(year, month, day, hour, minute, second); 257 258 // Delay the verification until we get a calendar we can compare the date to 259 if (date.hasRelCalendar() && !date.checkDate()) 260 ERROR("void parseDateDefault(StdIStream& in, CDate& date)", 261 << "Bad date format or not conform to calendar"); 262 263 if (c == '+') // We will be adding a duration to the date 264 { 265 CDuration dur; 266 in >> dur; 267 date = date + dur; 268 } 269 else if (!in.eof()) 270 ERROR("void parseDateDefault(StdIStream& in, CDate& date)", 271 << "Invalid date format: unexpected trailing character(s)"); 272 } 273 274 /*! Parse a date using the calendar's parser. */ 275 void CCalendar::parseDate(StdIStream& in, CDate& date) const 276 { 277 parseDateDefault(in, date); 278 } 279 280 /*! Test if a date is valid with regard to the current calendar. */ 281 bool CCalendar::checkDate(CDate& date) const 282 { 283 bool isValid = true; 284 285 // Vérification de la valeur du mois. 286 if (date.getMonth() < 1) 287 { isValid = false; date.setMonth(1); } 288 else if (date.getMonth() > getYearLength()) 289 { isValid = false; date.setMonth(getYearLength()); } 290 291 // Vérification de la valeur du jour. 292 if (date.getDay() < 1) 293 { isValid = false; date.setDay(1); } 294 else if (date.getDay() > getMonthLength(*this)) 295 { isValid = false; date.setDay(getMonthLength(*this)); } 296 297 // Vérification de la valeur de l'heure. 298 if (date.getHour() < 0) 299 { isValid = false; date.setHour(0); } 300 else if (date.getHour() >= getDayLength()) 301 { isValid = false; date.setHour(getDayLength() - 1); } 302 303 // Vérification de la valeur des minutes. 304 if (date.getMinute() < 0) 305 { isValid = false; date.setMinute(0); } 306 else if (date.getMinute() >= getHourLength()) 307 { isValid = false; date.setMinute(getHourLength() - 1); } 308 309 // Vérification de la valeur des secondes. 310 if (date.getSecond() < 0) 311 { isValid = false; date.setSecond(0); } 312 else if (date.getSecond() >= getMinuteLength()) 313 { isValid = false; date.setSecond(getMinuteLength() - 1); } 314 315 return isValid; 316 } 180 317 } // namespace xios
Note: See TracChangeset
for help on using the changeset viewer.