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