* 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:
parent
1fd632e67c
commit
daf3c50529
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user