* changed some methods to static as that's what they are in the end.

* added some methods to find out easter sunday, ascension and pentecost days.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40116 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval 2011-01-04 19:43:23 +00:00
parent 1fd632e67c
commit daf3c50529
2 changed files with 127 additions and 55 deletions

View File

@ -42,9 +42,9 @@ public:
status_t Archive(BMessage* into) const;
bool IsValid() const;
bool IsValid(const BTime& time) const;
bool IsValid(int32 hour, int32 minute, int32 second,
int32 microsecond = 0) const;
static bool IsValid(const BTime& time);
static bool IsValid(int32 hour, int32 minute, int32 second,
int32 microsecond = 0);
static BTime CurrentTime(time_type type);
@ -98,9 +98,9 @@ public:
status_t Archive(BMessage* into) const;
bool IsValid() const;
bool IsValid(const BDate& date) const;
bool IsValid(int32 year, int32 month,
int32 day) const;
static bool IsValid(const BDate& date);
static bool IsValid(int32 year, int32 month,
int32 day);
static BDate CurrentDate(time_type type);
@ -108,7 +108,8 @@ public:
bool SetDate(const BDate& date);
bool SetDate(int32 year, int32 month, int32 day);
void GetDate(int32* year, int32* month, int32* day);
void GetDate(int32* year, int32* month,
int32* day) const;
void AddDays(int32 days);
void AddYears(int32 years);
@ -123,7 +124,8 @@ public:
int32 DayOfYear() const;
int32 WeekNumber() const;
bool IsLeapYear(int32 year) const;
bool IsLeapYear() const;
static bool IsLeapYear(int32 year);
int32 DaysInYear() const;
int32 DaysInMonth() const;
@ -143,6 +145,10 @@ public:
int32 DateToJulianDay() const;
static BDate JulianDayToDate(int32 julianDay);
static BDate EasterSunday(int32 year);
static BDate AscensionDay(int32 year);
static BDate PentecostDay(int32 year);
bool operator!=(const BDate& date) const;
bool operator==(const BDate& date) const;
@ -153,10 +159,10 @@ public:
bool operator>=(const BDate& date) const;
private:
int32 _DaysInMonth(int32 year, int32 month) const;
static int32 _DaysInMonth(int32 year, int32 month);
bool _SetDate(int32 year, int32 month, int32 day);
int32 _DateToJulianDay(int32 year, int32 month,
int32 day) const;
static int32 _DateToJulianDay(int32 year, int32 month,
int32 day);
private:
int32 fDay;

View File

@ -78,7 +78,7 @@ BTime::BTime(const BMessage* archive)
{
if (archive == NULL)
return;
archive->FindInt64("mircoseconds", &fMicroseconds);
archive->FindInt64("microseconds", &fMicroseconds);
}
@ -102,7 +102,7 @@ BTime::Archive(BMessage* into) const
{
if (into == NULL)
return B_BAD_VALUE;
return into->AddInt64("mircoseconds", fMicroseconds);
return into->AddInt64("microseconds", fMicroseconds);
}
@ -120,18 +120,18 @@ BTime::IsValid() const
/*!
This is an overloaded member function, provided for convenience.
*/
bool
BTime::IsValid(const BTime& time) const
/*static*/ bool
BTime::IsValid(const BTime& time)
{
return time.fMicroseconds > -1 && time.fMicroseconds < kMicrosecondsPerDay;
return time.IsValid();
}
/*!
This is an overloaded member function, provided for convenience.
*/
bool
BTime::IsValid(int32 hour, int32 minute, int32 second, int32 microsecond) const
/*static*/ bool
BTime::IsValid(int32 hour, int32 minute, int32 second, int32 microsecond)
{
return BTime(hour, minute, second, microsecond).IsValid();
}
@ -205,8 +205,8 @@ BTime::SetTime(int32 hour, int32 minute, int32 second, int32 microsecond)
/*!
Adds \c hours to the current time. If the passed value is negativ it will
become earlier. Note: The time will wrap if it passes midnight.
Adds \c hours to the current time. If the passed value is negative it
will become earlier. Note: The time will wrap if it passes midnight.
*/
BTime&
BTime::AddHours(int32 hours)
@ -217,8 +217,8 @@ BTime::AddHours(int32 hours)
/*!
Adds \c minutes to the current time. If the passed value is negativ it will
become earlier. Note: The time will wrap if it passes midnight.
Adds \c minutes to the current time. If the passed value is negative it
will become earlier. Note: The time will wrap if it passes midnight.
*/
BTime&
BTime::AddMinutes(int32 minutes)
@ -229,8 +229,8 @@ BTime::AddMinutes(int32 minutes)
/*!
Adds \c seconds to the current time. If the passed value is negativ it will
become earlier. Note: The time will wrap if it passes midnight.
Adds \c seconds to the current time. If the passed value is negative
it will become earlier. Note: The time will wrap if it passes midnight.
*/
BTime&
BTime::AddSeconds(int32 seconds)
@ -241,8 +241,8 @@ BTime::AddSeconds(int32 seconds)
/*!
Adds \c milliseconds to the current time. If the passed value is negativ it
will become earlier. Note: The time will wrap if it passes midnight.
Adds \c milliseconds to the current time. If the passed value is negative
it will become earlier. Note: The time will wrap if it passes midnight.
*/
BTime&
BTime::AddMilliseconds(int32 milliseconds)
@ -253,8 +253,8 @@ BTime::AddMilliseconds(int32 milliseconds)
/*!
Adds \c microseconds to the current time. If the passed value is negativ it
will become earlier. Note: The time will wrap if it passes midnight.
Adds \c microseconds to the current time. If the passed value is negative
it will become earlier. Note: The time will wrap if it passes midnight.
*/
BTime&
BTime::AddMicroseconds(int32 microseconds)
@ -279,7 +279,8 @@ BTime::Hour() const
int32
BTime::Minute() const
{
return int32(((_Microseconds() % kMicrosecondsPerHour)) / kMicrosecondsPerMinute);
return int32(((_Microseconds() % kMicrosecondsPerHour))
/ kMicrosecondsPerMinute);
}
@ -310,7 +311,7 @@ BTime::Millisecond() const
int32
BTime::Microsecond() const
{
return int32(_Microseconds() % 1000000);
return int32(_Microseconds() % kMicrosecondsPerSecond);
}
@ -335,20 +336,21 @@ BTime::Difference(const BTime& time, diff_type type) const
{
bigtime_t diff = time._Microseconds() - _Microseconds();
switch (type) {
case B_HOURS_DIFF: {
case B_HOURS_DIFF:
diff /= kMicrosecondsPerHour;
} break;
case B_MINUTES_DIFF: {
break;
case B_MINUTES_DIFF:
diff /= kMicrosecondsPerMinute;
} break;
case B_SECONDS_DIFF: {
break;
case B_SECONDS_DIFF:
diff /= kMicrosecondsPerSecond;
} break;
case B_MILLISECONDS_DIFF: {
break;
case B_MILLISECONDS_DIFF:
diff /= 1000;
} break;
break;
case B_MICROSECONDS_DIFF:
default: break;
default:
break;
}
return diff;
}
@ -548,8 +550,8 @@ BDate::IsValid() const
/*!
This is an overloaded member function, provided for convenience.
*/
bool
BDate::IsValid(const BDate& date) const
/*static*/ bool
BDate::IsValid(const BDate& date)
{
return IsValid(date.fYear, date.fMonth, date.fDay);
}
@ -558,8 +560,8 @@ BDate::IsValid(const BDate& date) const
/*!
This is an overloaded member function, provided for convenience.
*/
bool
BDate::IsValid(int32 year, int32 month, int32 day) const
/*static*/ bool
BDate::IsValid(int32 year, int32 month, int32 day)
{
// no year 0 in Julian and nothing before 1.1.4713 BC
if (year == 0 || year < -4713)
@ -644,7 +646,7 @@ BDate::SetDate(int32 year, int32 month, int32 day)
will be set to 0.
*/
void
BDate::GetDate(int32* year, int32* month, int32* day)
BDate::GetDate(int32* year, int32* month, int32* day) const
{
if (year)
*year = fYear;
@ -855,12 +857,23 @@ BDate::DayOfYear() const
}
/*!
Returns true if the year of this object is a leap year, otherwise false. If
the \c year passed is before 4713 BC, the result is undefined.
*/
bool
BDate::IsLeapYear() const
{
return IsLeapYear(fYear);
}
/*!
Returns true if the passed \c year is a leap year, otherwise false. If the
\c year passed is before 4713 BC, the result is undefined.
*/
bool
BDate::IsLeapYear(int32 year) const
/*static*/ bool
BDate::IsLeapYear(int32 year)
{
if (year < 1582) {
if (year < 0)
@ -1036,12 +1049,12 @@ BDate::DateToJulianDay() const
}
/*
/*!
Converts the passed \c julianDay to an BDate. If the \c julianDay is negativ,
the function will return an invalid date. Because of the switch from Julian
calendar to Gregorian calendar the 4.10.1582 is followed by the 15.10.1582.
*/
BDate
/*static*/ BDate
BDate::JulianDayToDate(int32 julianDay)
{
BDate date;
@ -1056,8 +1069,8 @@ BDate::JulianDayToDate(int32 julianDay)
int32 a = (db / 365 + 1) * 3 / 4;
int32 da = db - a * 365;
int32 m = (da * 5 + 308) / 153 - 2;
date.fYear = ((j / 146097) * 400 + c * 100 + (dc / 1461) * 4 + a) - 4800 +
(m + 2) / 12;
date.fYear = ((j / 146097) * 400 + c * 100 + (dc / 1461) * 4 + a)
- 4800 + (m + 2) / 12;
date.fMonth = (m + 2) % 12 + 1;
date.fDay = int32((da - (m + 4) * 153 / 5 + 122) + 1.5);
} else if (julianDay >= 0) {
@ -1077,6 +1090,57 @@ BDate::JulianDayToDate(int32 julianDay)
}
/*!
Returns the date for easter sunday for the \c year.
*/
/*static*/ BDate
BDate::EasterSunday(int32 year)
{
// http://bloggingabout.net/blogs/jschreuder/archive/2005/06/24/7019.aspx
int32 gold = year % 19;
int32 century = year / 100;
int32 h = (century - (int32)(century / 4)
- (int32)((century * 8 + 13) / 25) + 19 * gold + 15) % 30;
int32 i = h - (int32)(h / 28) * (1 - (int32)(h / 28)
* (int32)(29 / (h + 1)) * (int32)((21 - gold) / 11));
BDate date;
date.fDay = i - ((year + (int32)(year / 4) + i + 2 - century
+ (int32)(century / 4)) % 7) + 28;
date.fMonth = 3;
date.fYear = year;
if (date.fDay > 31) {
date.fMonth++;
date.fDay -= 31;
}
return date;
}
/*!
Returns the date for ascension day for the \c year.
*/
/*static*/ BDate
BDate::AscensionDay(int32 year)
{
BDate date = AscensionDay(year);
date.AddDays(39);
return date;
}
/*!
Returns the date for pentecost day for the \c year.
*/
/*static*/ BDate
BDate::PentecostDay(int32 year)
{
BDate date = AscensionDay(year);
date.AddDays(49);
return date;
}
/*!
Returns true if this date is different from \c date, otherwise false.
*/
@ -1108,7 +1172,8 @@ BDate::operator<(const BDate& date) const
/*!
Returns true if this date is earlier than or equal to \c date, otherwise false.
Returns true if this date is earlier than or equal to \c date, otherwise
false.
*/
bool
BDate::operator<=(const BDate& date) const
@ -1128,7 +1193,8 @@ BDate::operator>(const BDate& date) const
/*!
Returns true if this date is later than or equal to \c date, otherwise false.
Returns true if this date is later than or equal to \c date, otherwise
false.
*/
bool
BDate::operator>=(const BDate& date) const
@ -1156,7 +1222,7 @@ BDate::_SetDate(int32 year, int32 month, int32 day)
int32
BDate::_DaysInMonth(int32 year, int32 month) const
BDate::_DaysInMonth(int32 year, int32 month)
{
if (month == 2 && IsLeapYear(year))
return 29;
@ -1169,7 +1235,7 @@ BDate::_DaysInMonth(int32 year, int32 month) const
int32
BDate::_DateToJulianDay(int32 _year, int32 month, int32 day) const
BDate::_DateToJulianDay(int32 _year, int32 month, int32 day)
{
if (IsValid(_year, month, day)) {
int32 year = _year;
@ -1373,7 +1439,7 @@ BDateTime::Time_t() const
tm_struct.tm_mon = fDate.Month() - 1;
tm_struct.tm_mday = fDate.Day();
// set less 0 as we wan't use it
// set less 0 as we won't use it
tm_struct.tm_isdst = -1;
// return secs_since_jan1_1970 or -1 on error