X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ftime%2Fdatetime.cpp;h=2d7c19585cefeea0838b045643a9b9aaac588db7;hb=cd89068b8ebafdc0f888c1aa21498bb93b55d814;hp=d74fc6fbd0be4aef046626224e305830b4450a4e;hpb=521cf1db00f8ce2d9f9494dca503d6c17d89ac2f;p=libs%2Fcore.git diff --git a/source/time/datetime.cpp b/source/time/datetime.cpp index d74fc6f..2d7c195 100644 --- a/source/time/datetime.cpp +++ b/source/time/datetime.cpp @@ -1,7 +1,7 @@ /* $Id$ */ #include #include -#include "../core/error.h" +#include "../core/except.h" #include "datetime.h" #include "timestamp.h" @@ -9,10 +9,10 @@ using namespace std; namespace { -inline bool is_leap_year(int32_t y) +inline bool is_leap_year(int y) { return y%4==0 && (y%100 || y%400==0); } -inline uint8_t month_days(int32_t y, uint8_t m) +inline unsigned char month_days(int y, unsigned char m) { switch(m) { @@ -55,7 +55,7 @@ DateTime::DateTime(const TimeStamp &ts): add_raw(ts.raw()); } -DateTime::DateTime(int32_t y, uint8_t m, uint8_t d): +DateTime::DateTime(int y, unsigned char m, unsigned char d): year(y), month(m), mday(d), @@ -63,9 +63,11 @@ DateTime::DateTime(int32_t y, uint8_t m, uint8_t d): minute(0), second(0), usec(0) -{ } +{ + validate(); +} -DateTime::DateTime(int32_t y, uint8_t m, uint8_t d, uint8_t h, uint8_t n, uint8_t s): +DateTime::DateTime(int y, unsigned char m, unsigned char d, unsigned char h, unsigned char n, unsigned char s): year(y), month(m), mday(d), @@ -73,9 +75,11 @@ DateTime::DateTime(int32_t y, uint8_t m, uint8_t d, uint8_t h, uint8_t n, uint8_ minute(n), second(s), usec(0) -{ } +{ + validate(); +} -DateTime::DateTime(int32_t y, uint8_t m, uint8_t d, uint8_t h, uint8_t n, uint8_t s, uint32_t u): +DateTime::DateTime(int y, unsigned char m, unsigned char d, unsigned char h, unsigned char n, unsigned char s, unsigned u): year(y), month(m), mday(d), @@ -83,9 +87,11 @@ DateTime::DateTime(int32_t y, uint8_t m, uint8_t d, uint8_t h, uint8_t n, uint8_ minute(n), second(s), usec(u) -{ } +{ + validate(); +} -void DateTime::add_days(int32_t days) +void DateTime::add_days(int days) { unsigned new_year=year; @@ -188,7 +194,7 @@ TimeStamp DateTime::get_timestamp() const if(year<-289701 || year>293641) throw Exception("DateTime is not representable as a TimeStamp"); - int64_t raw=(((hour*60LL)+minute)*60+second)*1000000+usec; + RawTime raw=(((hour*60LL)+minute)*60+second)*1000000+usec; int days=(year-1970)*365; days+=(year-1)/4-(year-1)/100+(year-1)/400-477; for(unsigned i=1; i(raw/86400000000LL); raw%=86400000000LL; if(raw<0) { @@ -280,5 +286,21 @@ void DateTime::normalize() } } +void DateTime::validate() const +{ + if(usec>=1000000) + throw InvalidParameterValue("Microseconds out of range"); + if(second>=60) + throw InvalidParameterValue("Seconds out of range"); + if(minute>=60) + throw InvalidParameterValue("Minutes out of range"); + if(hour>=24) + throw InvalidParameterValue("Hours out of range"); + if(month<1 || month>12) + throw InvalidParameterValue("Month out of range"); + if(mday<1 || mday>month_days(year, month)) + throw InvalidParameterValue("Day of month out of range"); +} + } // namespace Time } // namespace Msp