CoolPotOS/apps/libs/timer.c

153 lines
4.5 KiB
C
Raw Normal View History

2024-09-08 22:43:05 +08:00
#include "../include/time.h"
#include "../include/stdlib.h"
#include "../include/rand.h"
#define JAN_1970 0x83aa7e80
#define COMMON_YEAR_SEC 31536000
#define LEAP_YEAR_SEC 31622400
#define DAY_SEC 86400
struct tm *tm_ = NULL;
static int table1[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
static int table2[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
void UnTimeStamp(uint32_t timestamp, uint32_t *year, uint32_t *month,
uint32_t *day, uint32_t *hour, uint32_t *min, uint32_t *sec,
uint32_t *yday, uint32_t *mday, uint32_t *wday) {
timestamp += 28800;
uint32_t y = 1970;
for (;; y++) {
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
timestamp -= LEAP_YEAR_SEC;
if (timestamp <= COMMON_YEAR_SEC) {
break;
}
} else {
timestamp -= COMMON_YEAR_SEC;
if (timestamp <= COMMON_YEAR_SEC ||
((((y + 1) % 4 == 0 && (y + 1) % 100 != 0) || (y + 1) % 400 == 0) &&
timestamp <= LEAP_YEAR_SEC)) {
break;
}
}
}
*year = y + 1;
uint32_t month0 = 1;
if ((*year % 4 == 0 && *year % 100 != 0) || *year % 400 == 0) {
for (; timestamp > table2[month0 - 1] * DAY_SEC; month0++) {
timestamp -= table2[month0 - 1] * DAY_SEC;
}
} else {
for (; timestamp > table1[month0 - 1] * DAY_SEC; month0++) {
timestamp -= table1[month0 - 1] * DAY_SEC;
}
}
*month = month0;
*day = timestamp / DAY_SEC + 1;
timestamp = timestamp % DAY_SEC;
*hour = timestamp / 3600;
timestamp = timestamp % 3600;
*min = timestamp / 60;
*sec = timestamp % 60;
// 计算一年中的第几天
int days = 0;
if ((*year % 4 == 0 && *year % 100 != 0) || *year % 400 == 0) {
for (int i = 0; i < month0 - 1; i++) {
days += table2[i];
}
} else {
for (int i = 0; i < month0 - 1; i++) {
days += table1[i];
}
}
days += *day;
*yday = days;
// 计算一个月中的第几天
*mday = *day;
int totalDays = *yday; // 一年中的第几天从0开始计数
int startYear = 1970;
int startWeekday = 1; // 1970年1月1日是星期一
for (int year1 = startYear; year1 <= *year; year1++) {
if ((year1 % 4 == 0 && year1 % 100 != 0) || year1 % 400 == 0) {
totalDays += 366; // 闰年有366天
} else {
totalDays += 365; // 平年有365天
}
}
int weekday = (startWeekday + totalDays) % 7;
*wday = weekday;
return;
}
struct tm *localtime(time_t *t1) {
time_t t = *t1;
if (!tm_) {
tm_ = malloc(sizeof(struct tm));
}
UnTimeStamp(t, &(tm_->tm_year), &(tm_->tm_mon), &(tm_->tm_mday),
&(tm_->tm_hour), &(tm_->tm_min), &(tm_->tm_sec), &(tm_->tm_yday),
&(tm_->tm_mday),&(tm_->tm_wday));
tm_->tm_year -= 1970;
tm_->tm_mon--;
return tm_;
}
double difftime(time_t t1, time_t t0) { return t1 - t0; }
void clock_gettime(int *sec1, int *usec1) {
int b = clock() * 10;
*sec1 = b / 1000;
*usec1 = (b % 1000) * 1000;
}
time_t time(time_t timer) { return rand(); }
time_t mktime(struct tm *tm) {
// 判断年份是否在有效范围内1970年以后
if (tm->tm_year < 70) {
return (time_t)-1;
}
// 将月份调整为从 0 开始0 表示一月1 表示二月,以此类推)
tm->tm_mon -= 1;
// 计算1970年到tm->tm_year年的天数
int year, leapYearCount;
int monthDays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
leapYearCount = (tm->tm_year - 69) / 4; // 计算闰年的个数
year = 70 + tm->tm_year;
int totalDays = 0;
for (int i = 70; i < year; i++) {
if (i % 4 == 0 && (i % 100 != 0 || i % 400 == 0)) {
totalDays += 366; // 闰年有 366 天
} else {
totalDays += 365; // 平年有 365 天
}
}
// 计算tm->tm_mon前的月份的天数
for (int i = 0; i < tm->tm_mon; i++) {
totalDays += monthDays[i];
}
// 若是闰年且过了2月则总天数加一
if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0) && tm->tm_mon > 1) {
totalDays += 1;
}
// 加上日期差值
totalDays += tm->tm_mday - 1;
// 计算总的秒数
time_t seconds = totalDays * 24 * 60 * 60 + tm->tm_hour * 60 * 60 +
tm->tm_min * 60 + tm->tm_sec;
return seconds;
}