| | |
| | | #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; |
| | |
| | | } |
| | | } |
| | | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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) |