C语言实现格林威治时间转北京时间+根据日期计算星期几

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



程序运行结果:

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

觉皇嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值