mirror of https://github.com/bsnes-emu/bsnes.git
84 lines
1.8 KiB
C++
84 lines
1.8 KiB
C++
const uint SharpRTC::daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
|
|
|
auto SharpRTC::tickSecond() -> void {
|
|
if(++second < 60) return;
|
|
second = 0;
|
|
tickMinute();
|
|
}
|
|
|
|
auto SharpRTC::tickMinute() -> void {
|
|
if(++minute < 60) return;
|
|
minute = 0;
|
|
tickHour();
|
|
}
|
|
|
|
auto SharpRTC::tickHour() -> void {
|
|
if(++hour < 24) return;
|
|
hour = 0;
|
|
tickDay();
|
|
}
|
|
|
|
auto SharpRTC::tickDay() -> void {
|
|
uint days = daysInMonth[(month - 1) % 12];
|
|
|
|
//add one day in February for leap years
|
|
if(month == 2) {
|
|
if(year % 400 == 0) days++;
|
|
else if(year % 100 == 0);
|
|
else if(year % 4 == 0) days++;
|
|
}
|
|
|
|
if(day++ < days) return;
|
|
day = 1;
|
|
tickMonth();
|
|
}
|
|
|
|
auto SharpRTC::tickMonth() -> void {
|
|
if(month++ < 12) return;
|
|
month = 1;
|
|
tickYear();
|
|
}
|
|
|
|
auto SharpRTC::tickYear() -> void {
|
|
year++;
|
|
year = (uint12)year;
|
|
}
|
|
|
|
//returns day of week for specified date
|
|
//eg 0 = Sunday, 1 = Monday, ... 6 = Saturday
|
|
//usage: calculate_weekday(2008, 1, 1) returns weekday of January 1st, 2008
|
|
auto SharpRTC::calculateWeekday(uint year, uint month, uint day) -> uint {
|
|
uint y = 1000, m = 1; //SharpRTC epoch is 1000-01-01
|
|
uint sum = 0; //number of days passed since epoch
|
|
|
|
year = max(1000, year);
|
|
month = max(1, min(12, month));
|
|
day = max(1, min(31, day));
|
|
|
|
while(y < year) {
|
|
bool leapyear = false;
|
|
if(y % 4 == 0) {
|
|
leapyear = true;
|
|
if(y % 100 == 0 && y % 400 != 0) leapyear = false;
|
|
}
|
|
sum += 365 + leapyear;
|
|
y++;
|
|
}
|
|
|
|
while(m < month) {
|
|
uint days = daysInMonth[(m - 1) % 12];
|
|
bool leapyearmonth = false;
|
|
if(days == 28) {
|
|
if(y % 4 == 0) {
|
|
leapyearmonth = true;
|
|
if(y % 100 == 0 && y % 400 != 0) leapyearmonth = false;
|
|
}
|
|
}
|
|
sum += days + leapyearmonth;
|
|
m++;
|
|
}
|
|
|
|
sum += day - 1;
|
|
return (sum + 3) % 7; //1000-01-01 was a Wednesday
|
|
}
|