CoolPotOS/apps/libs/timer.c

153 lines
4.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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