diff --git a/AK/Time.h b/AK/Time.h index a5209908a9b..309218747b7 100644 --- a/AK/Time.h +++ b/AK/Time.h @@ -33,6 +33,16 @@ inline bool is_leap_year(int year) return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0); } +inline int years_to_days_since_epoch(int year) +{ + int days = 0; + for (int current_year = 1970; current_year < year; ++current_year) + days += 365 + is_leap_year(current_year); + for (int current_year = year; current_year < 1970; ++current_year) + days -= 365 + is_leap_year(current_year); + return days; +} + template inline void timeval_sub(const TimevalType& a, const TimevalType& b, TimevalType& result) { @@ -160,6 +170,7 @@ using AK::timespec_to_timeval; using AK::timeval_add; using AK::timeval_sub; using AK::timeval_to_timespec; +using AK::years_to_days_since_epoch; using AK::operator<=; using AK::operator<; using AK::operator>; diff --git a/Kernel/RTC.cpp b/Kernel/RTC.cpp index d2944f7100e..25f494bd983 100644 --- a/Kernel/RTC.cpp +++ b/Kernel/RTC.cpp @@ -93,18 +93,6 @@ static unsigned days_in_months_since_start_of_year(unsigned month, unsigned year return days; } -static unsigned days_in_years_since_epoch(unsigned year) -{ - unsigned days = 0; - while (year > 1969) { - days += 365; - if (is_leap_year(year)) - ++days; - --year; - } - return days; -} - static u8 bcd_to_binary(u8 bcd) { return (bcd & 0x0F) + ((bcd >> 4) * 10); @@ -160,7 +148,7 @@ time_t now() ASSERT(year >= 2018); - return days_in_years_since_epoch(year - 1) * 86400 + return years_to_days_since_epoch(year) * 86400 + days_in_months_since_start_of_year(month - 1, year) * 86400 + (day - 1) * 86400 + hour * 3600 diff --git a/Libraries/LibC/time.cpp b/Libraries/LibC/time.cpp index fce068699a7..7a49ec8a95d 100644 --- a/Libraries/LibC/time.cpp +++ b/Libraries/LibC/time.cpp @@ -116,11 +116,7 @@ static time_t tm_to_time(struct tm* tm, long timezone_adjust_seconds) tm->tm_mon += 12; } - int days = 0; - for (int year = 70; year < tm->tm_year; ++year) - days += 365 + is_leap_year(1900 + year); - for (int year = tm->tm_year; year < 70; ++year) - days -= 365 + is_leap_year(1900 + year); + int days = years_to_days_since_epoch(1900 + tm->tm_year); tm->tm_yday = tm->tm_mday - 1; for (int month = 0; month < tm->tm_mon; ++month)