119 lines
2.4 KiB
C
119 lines
2.4 KiB
C
#include "timestamp.h"
|
|
|
|
|
|
|
|
#define UTC_BASE_YEAR 1970
|
|
#define MONTH_PER_YEAR 12
|
|
#define DAY_PER_YEAR 365
|
|
#define SEC_PER_DAY 86400
|
|
#define SEC_PER_HOUR 3600
|
|
#define SEC_PER_MIN 60
|
|
|
|
/* Number of days per month */
|
|
static const u8 days_per_month[MONTH_PER_YEAR] = {
|
|
/*
|
|
1 2 3 4 5 6 7 8 9 10 11 12
|
|
*/
|
|
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
|
|
};
|
|
|
|
static bool get_is_leap_year(u16 year)
|
|
{
|
|
if (((year % 4) == 0) && ((year % 100) != 0)) {
|
|
return 1;
|
|
} else if ((year % 400) == 0) {
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static u8 get_day_of_mon(u8 month, u16 year)
|
|
{
|
|
if ((month == 0) || (month > 12)) {
|
|
return days_per_month[1] + get_is_leap_year(year);
|
|
}
|
|
|
|
if (month != 2) {
|
|
return days_per_month[month - 1];
|
|
} else {
|
|
return days_per_month[1] + get_is_leap_year(year);
|
|
}
|
|
}
|
|
|
|
void timestamp_utc_sec_2_mytime(u32 utc_sec, struct sys_time *mytime)
|
|
{
|
|
if (mytime == NULL) {
|
|
return;
|
|
}
|
|
int32_t sec, day;
|
|
u16 y;
|
|
u8 m;
|
|
u16 d;
|
|
|
|
sec = utc_sec % SEC_PER_DAY;
|
|
mytime->hour = sec / SEC_PER_HOUR;
|
|
|
|
sec %= SEC_PER_HOUR;
|
|
mytime->min = sec / SEC_PER_MIN;
|
|
|
|
mytime->sec = sec % SEC_PER_MIN;
|
|
|
|
day = utc_sec / SEC_PER_DAY;
|
|
for (y = UTC_BASE_YEAR; day > 0; y++) {
|
|
d = (DAY_PER_YEAR + get_is_leap_year(y));
|
|
if (day >= d) {
|
|
day -= d;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
|
|
mytime->year = y;
|
|
|
|
for (m = 1; m < MONTH_PER_YEAR; m++) {
|
|
d = get_day_of_mon(m, y);
|
|
if (day >= d) {
|
|
day -= d;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
|
|
mytime->month = m;
|
|
mytime->day = (u8)(day + 1);
|
|
}
|
|
|
|
u32 timestamp_mytime_2_utc_sec(struct sys_time *mytime)
|
|
{
|
|
if (mytime == NULL) {
|
|
return 0;
|
|
}
|
|
u16 i;
|
|
u32 no_of_days = 0;
|
|
u32 utc_time;
|
|
/* u8 dst = 1; */
|
|
|
|
if (mytime->year < UTC_BASE_YEAR) {
|
|
return 0;
|
|
}
|
|
|
|
for (i = UTC_BASE_YEAR; i < mytime->year; i++) {
|
|
no_of_days += (DAY_PER_YEAR + get_is_leap_year(i));
|
|
}
|
|
|
|
for (i = 1; i < mytime->month; i++) {
|
|
no_of_days += get_day_of_mon(i, mytime->year);
|
|
}
|
|
|
|
no_of_days += (mytime->day - 1);
|
|
|
|
utc_time = (unsigned int) no_of_days * SEC_PER_DAY + (unsigned int)(mytime->hour * SEC_PER_HOUR +
|
|
mytime->min * SEC_PER_MIN + mytime->sec);
|
|
|
|
return utc_time;
|
|
}
|
|
|
|
|
|
|