#define _DATE_CALC_ #include #include "brtc.h" #include "date_calc.h" #include "asutil.h" const u16 aMonth[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}; const u16 bMonth[13] = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}; const u8 fstrWeek[7][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; static u32 StrToInt32(u8 *text, u16 size) { s16 i; u32 a = 1, k = 0; for (i = (size - 1); i >= 0; i--) { k += (text[i] - '0') * a; a *= 10; } return k; } u32 CalcDay(u32 iYear, u32 iMonth, u32 iDay) { u8 flag = false; u32 TotalDays, i, cnt; cnt = 0; for (i = 1; i < iYear; i++) { if (((i % 4) == 0 && (i % 100) !=0) || (i % 400) == 0) { // Leap year calculation. cnt++; } } if (((iYear % 4) == 0 && (iYear % 100) !=0) || (iYear % 400) == 0) flag = true; TotalDays = (iYear - 1) * 365 + cnt; if (flag == true) TotalDays += bMonth[iMonth - 1] + iDay; else TotalDays += aMonth[iMonth - 1] + iDay; return TotalDays; } u8 CheckLeapYear(u16 Year) { u8 result = false; if (((Year % 4) == 0 && (Year % 100) != 0) || (Year % 400) == 0) result = true; return result; } u32 CalcOneYearToDay(u16 Year) { u32 result; result = 365; if (((Year % 4) == 0 && (Year % 100) != 0) || (Year % 400) == 0) result++; return result; } void CalcTimeStampToDateTime(u32 TimeStamp, void *datetime) { u32 DateTimeStamp; u32 DivSec, ModSec, DivMin, ModMin, DivHour, ModHour; u32 tDay, DivDay, ModDay, i; _PTIME dt = (_PTIME)datetime; ModSec = TimeStamp % 60; DivSec = TimeStamp / 60; ModMin = DivSec % 60; DivMin = DivSec / 60; ModHour = DivMin % 24; DivHour = DivMin / 24; dt->hour = ModHour; dt->min = ModMin; dt->sec = ModSec; DateTimeStamp = DivHour; DateTimeStamp++; tDay = 0; i = 0; while (tDay < DateTimeStamp) tDay += CalcOneYearToDay(UTC_YEAR + i++); i--; tDay -= CalcOneYearToDay(UTC_YEAR + i); dt->year = i; DivDay = DateTimeStamp - tDay; if (CheckLeapYear(UTC_YEAR + dt->year)) { for (i = 1; i < 13; i++) if (DivDay <= bMonth[i]) break; } else { for (i = 1; i < 13; i++) if (DivDay <= aMonth[i]) break; } dt->month = i; if (CheckLeapYear(UTC_YEAR + dt->year)) { ModDay = DivDay - bMonth[i - 1]; } else { ModDay = DivDay - aMonth[i - 1]; } dt->date = ModDay; } //void CalcTimeStampToDateTime1(u32 TimeStamp, u8 *DateTime) //{ // u32 tDay, DivDay, ModDay, i; // u32 aDateStamp; // u16 tYear, tMonth, tDate; // aDateStamp = TimeStamp / 60 / 60 / 24; // aDateStamp++; // tDay = 0; // i = 0; // while (tDay < aDateStamp) { // tDay += CalcOneYearToDay(UTC_YEAR + i++); // if (i >= 100) break; // } // if (i < 100) { // i--; // tDay -= CalcOneYearToDay(UTC_YEAR + i); // tYear = UTC_YEAR + i; // DivDay = aDateStamp - tDay; // if (CheckLeapYear(tYear)) { // for (i = 1; i < 13; i++) // if (DivDay <= bMonth[i]) break; // } else { // for (i = 1; i < 13; i++) // if (DivDay <= aMonth[i]) break; // } // tMonth = i; // if (CheckLeapYear(tYear)) { // ModDay = DivDay - bMonth[i - 1]; // } else { // ModDay = DivDay - aMonth[i - 1]; // } // tDate = ModDay; // sprintf((char *)DateTime, "%04d/%02d/%02d", // tYear, // tMonth, // tDate // ); // } else { // sprintf((char *)DateTime, "----/--/--"); // } //} #ifdef CONSOLE_DEBUG void CalcDateStampToDateTime(u32 DateStamp, u8 *DateTime) { u32 DivDay, ModDay, tDay, i; u16 year, month, date; tDay = 0; i = 0; while (tDay < DateStamp) { tDay += CalcOneYearToDay(UTC_YEAR + i++); if (i >= 200) break; } if (i < 200) { i--; tDay -= CalcOneYearToDay(UTC_YEAR + i); year = UTC_YEAR + i; DivDay = DateStamp - tDay; if (CheckLeapYear(year)) { for (i = 0; i < 13; i++) if (DivDay <= bMonth[i]) break; } else { for (i = 0; i < 13; i++) if (DivDay <= aMonth[i]) break; } month = i; if (CheckLeapYear(year)) { ModDay = DivDay - bMonth[i - 1]; } else { ModDay = DivDay - aMonth[i - 1]; } date = ModDay; sprintf((char *)DateTime, "%04d/%02d/%02d", year, month, date ); } else { sprintf((char *)DateTime, "----/--/--"); } } #endif // #ifdef CONSOLE_DEBUG u32 DateStampToTimeStamp(u32 DateStamp) { return (DateStamp * 24 * 60 * 60 - UTC_KOREA); } #ifdef CONSOLE_DEBUG u32 DateStrToDateStamp(u8 *DateTime) { u32 year, month, date; u32 aDateStamp; year = StrToInt32(&DateTime[0], 4); month = StrToInt32(&DateTime[4], 2); date = StrToInt32(&DateTime[6], 2); aDateStamp = CalcDay(year, month, date) - UTC_TIMESTAMP; return (DateStampToTimeStamp(aDateStamp)); } #endif // #ifdef CONSOLE_DEBUG u32 DateTimeToTimeStamp(PDateTimePacket adate) { u32 aDateStamp; u32 aDateTimeStamp; aDateStamp = CalcDay(adate->year, adate->month, adate->date) - UTC_TIMESTAMP; aDateTimeStamp = DateStampToTimeStamp(aDateStamp); aDateTimeStamp += ((u32)adate->hour * 60 * 60) + ((u32)adate->min * 60) + (u32)adate->sec; return aDateTimeStamp; } u32 DateTimeStrToTimeStamp(u8 *DateTime) { u32 year, month, date; u32 hour, min, sec; u32 aDateStamp; u32 aTimeStamp; year = StrToInt32(&DateTime[0], 4); month = StrToInt32(&DateTime[4], 2); date = StrToInt32(&DateTime[6], 2); hour = StrToInt32(&DateTime[8], 2); min = StrToInt32(&DateTime[10], 2); sec = StrToInt32(&DateTime[12], 2); aDateStamp = CalcDay(year, month, date) - UTC_TIMESTAMP; aTimeStamp = (aDateStamp * 24 * 60 * 60) + (hour * 60 * 60) + (min * 60) + sec; return (aTimeStamp); }