289 lines
6.0 KiB
C
289 lines
6.0 KiB
C
#define _DATE_CALC_
|
|
|
|
#include <includes.h>
|
|
#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);
|
|
}
|
|
|
|
|