Files

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