C语言实现格林威治时间转北京时间+根据日期计算星期几
【北京时间=GMT时间+8小时】
/*
* main.c
*
* Created on: 2021年12月16日
* Author: hello
*/
#include <stdint.h>
#include <stdio.h>
#define debug(...) do{printf(__VA_ARGS__);fflush(stdout);}while(0)
typedef struct
{
int year;
int month;
int day;
int hours;
int minutes;
int seconds;
int weekday;
}mytime_t;
/// 返回值:1-7,对应周一到周天
uint8_t GetWeekDayNum(uint32_t year, uint8_t month, uint8_t day)
{
uint32_t weekday = 0U;
if (month < 3U)
{
/*D = { [(23 x month)/9] + day + 4 + year + [(year-1)/4] - [(year-1)/100] + [(year-1)/400] } mod 7*/
weekday = (((23U * month) / 9U) + day + 4U + year + ((year - 1U) / 4U) - ((year - 1U) / 100U) + ((year - 1U) / 400U)) % 7U;
}
else
{
/*D = { [(23 x month)/9] + day + 4 + year + [year/4] - [year/100] + [year/400] - 2 } mod 7*/
weekday = (((23U * month) / 9U) + day + 4U + year + (year / 4U) - (year / 100U) + (year / 400U) - 2U) % 7U;
}
if(weekday == 0)
{
weekday = 7;
}
return (uint8_t)weekday;
}
void UTCToBeijing(mytime_t* time)
{
uint8_t days = 0;
if (time->month == 1 || time->month == 3 || time->month == 5 || time->month == 7 || time->month == 8 || time->month == 10 || time->month == 12)
{
days = 31;
}
else if (time->month == 4 || time->month == 6 || time->month == 9 || time->month == 11)
{
days = 30;
}
else if (time->month == 2)
{
if ((time->year % 400 == 0) || ((time->year % 4 == 0) && (time->year % 100 != 0))) /* 判断平年还是闰年 */
{
days = 29;
}
else
{
days = 28;
}
}
time->hours += 8; /* 北京时间比格林威治时间快8小时 */
if (time->hours >= 24) /* 跨天 */
{
time->hours -= 24;
time->day++;
if (time->day > days) /* 跨月 */
{
time->day = 1;
time->month++;
if (time->month > 12) /* 跨年 */
{
time->year++;
}
}
}
time->weekday = GetWeekDayNum(time->year, time->month, time->day); /* 重新计算周 */
}
int main()
{
mytime_t utctime;
utctime.year = 2021;
utctime.month = 12;
utctime.day = 16;
utctime.hours = 8;
utctime.minutes = 16;
utctime.seconds = 30;
utctime.weekday = 4;
debug("utc : %04d-%02d-%02d %02d:%02d:%02d %d\r\n",
utctime.year,
utctime.month,
utctime.day,
utctime.hours,
utctime.minutes,
utctime.seconds,
utctime.weekday
);
UTCToBeijing(&utctime);
debug("beijing : %04d-%02d-%02d %02d:%02d:%02d %d\r\n",
utctime.year,
utctime.month,
utctime.day,
utctime.hours,
utctime.minutes,
utctime.seconds,
utctime.weekday
);
return 0;
}
程序运行结果: