mnynt121 发表于 2025-3-26 07:00

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

#include <stdint.h>

#include <stdio.h>



typedef struct

{

      int year;

      int month;

      int day;

      int hours;

      int minutes;

      int seconds;

      int weekday;

}mytime_t;

mytime_t utctime;



unsigned int   Year,Mon,Day,Shi,Fen,Miao,Zhou;



/// 返回值: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 + - + - 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);/* 重新计算周 */

}



void GMT_time()

{

      //第一步:输入对应UTC时间

      utctime.year = 2021;

      utctime.month = 12;

      utctime.day =27;

      utctime.hours = 18;

      utctime.minutes = 2;

      utctime.seconds = 10;

      utctime.weekday = 1;



      //第二步:处理

      UTCToBeijing(&utctime);//处理

      
       //第三步:下面就是北京时间

      Year   =utctime.yea;

      Mon   =utctime.mont;

      Day   =utctime.da;

      Shi    =utctime.hour;

      Fen   =utctime.minutes;

      Miao=utctime.second;

      Zhou =utctime.weekda;



}



原文链接:https://blog.csdn.net/qq153471503/article/details/107157470

yangxiaor520 发表于 2025-3-26 21:23

直接转载代码,这帖子越来越水了

呐咯密密 发表于 2025-3-28 16:31

加一点解读就好了

shenxiaolin 发表于 2025-3-28 20:54

学习一下

地瓜patch 发表于 2025-3-28 22:54

做称文件上传附在后边更换
页: [1]
查看完整版本: 格林威治时间转北京时间+根据日期计算星期几 C语言程序