From 4bd08f0355b6b2cf3c027202d5ad301b4e182953 Mon Sep 17 00:00:00 2001 From: yy1717 <fctom1215@outlook.com> Date: 星期五, 31 三月 2023 17:16:22 +0800 Subject: [PATCH] 科目二修改 --- lib/src/main/cpp/utils/xconvert.cpp | 86 ++++++++++++++++++++++++++++++++++--------- 1 files changed, 68 insertions(+), 18 deletions(-) diff --git a/lib/src/main/cpp/utils/xconvert.cpp b/lib/src/main/cpp/utils/xconvert.cpp index b411ffb..87f3d51 100644 --- a/lib/src/main/cpp/utils/xconvert.cpp +++ b/lib/src/main/cpp/utils/xconvert.cpp @@ -22,6 +22,8 @@ #define DAYS_PER_WEEK 7 #define DAYS_PER_YEAR 365 +#define DAYS_UP_TO_1970 ((70*365LU) +17) + double ConvertKMh2Ms(int kmh) { return ((double)kmh) * 1000.0 / 3600.0; @@ -86,9 +88,20 @@ } } +static int TimeMonthOffset( int leapStatus, uint8_t mon ) +{ + const int monthOffsets[2][12] = + { +/* jan feb mar apr may jun jul aug sep oct nov dec */ + {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}, /* regular year */ + {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335} /* leap year */ + }; + return monthOffsets[leapStatus][mon] ; +} + const int LibTimeDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; -static inline bool TimeYearIsLeap(int year) +static bool TimeYearIsLeap(int year) { if ((year % 4) || year == 2100) return false; @@ -113,7 +126,7 @@ for (i = 0; i<(month - 1); i++) daysThisYear += (int)LibTimeDays[i]; - for (i = 2000; i<year; i++) { + for (i = 1970; i<year; i++) { daysThisYear += 365; if (TimeYearIsLeap(i)) daysThisYear += 1; @@ -127,22 +140,59 @@ return (hour*SECONDS_PER_HOUR + minute*SECONDS_PER_MINUTE + second) * 1000 + msecond; } -/********************************************************* - * TIME1 - TIME2: msecond - * @param hour1 - * @param minute1 - * @param second1 - * @param msecond1 - * @param hour2 - * @param minute2 - * @param second2 - * @param msecond2 - * @return - */ -uint32_t TimeGetDiff(int hour1, int minute1, int second1, int msecond1, int hour2, int minute2, int second2, int msecond2) -{ - return (TimeMakeComposite(hour1, minute1, second1, msecond1) + SECONDS_PER_DAY * 1000 - - TimeMakeComposite(hour2, minute2, second2, msecond2)) % (SECONDS_PER_DAY * 1000); +void TimeBreakdown(uint32_t SecondsSince1970 , struct TimeStructure *pTS) { + uint16_t yearSince1900; + uint32_t days; + uint32_t daysTillYearStarted; + uint32_t secs; + bool isLeapYear; + uint16_t leapDaysSince1900; + + secs = SecondsSince1970; + days = SecondsSince1970 / SECONDS_PER_DAY; + + // 1970.1.1 is Thursday + pTS->Wday = (days + 4) % DAYS_PER_WEEK; /* days since Sunday */ + + yearSince1900 = (days / DAYS_PER_YEAR) + 70; + + leapDaysSince1900 = (yearSince1900 - 1) / 4; + + if (yearSince1900 > 200) + leapDaysSince1900 -= 1; + + daysTillYearStarted = leapDaysSince1900 + (365L * yearSince1900); + + if (days + DAYS_UP_TO_1970 < daysTillYearStarted) { + yearSince1900--; + + leapDaysSince1900 = (yearSince1900 - 1) / 4; + + if (yearSince1900 > 200) + leapDaysSince1900 -= 1; + daysTillYearStarted = leapDaysSince1900 + (365L * yearSince1900); + } + days = days - (daysTillYearStarted - DAYS_UP_TO_1970); + + pTS->Year = yearSince1900 + 1900; + pTS->Yday = days; + + isLeapYear = TimeYearIsLeap(pTS->Year); + + pTS->Month = 12; + do { + pTS->Month--; + } while (days < TimeMonthOffset(isLeapYear? 1 : 0, pTS->Month)); + + pTS->Day = days - TimeMonthOffset(isLeapYear? 1: 0, pTS->Month) + 1; + + pTS->Month++; + + secs %= SECONDS_PER_DAY; + pTS->Hour = secs / SECONDS_PER_HOUR; + secs %= SECONDS_PER_HOUR; + pTS->Minute = secs / 60; + pTS->Second = secs % 60; } vector<string> split(string str, string pattern) -- Gitblit v1.8.0