找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1240|回复: 0
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
ID:740383 发表于 2021-12-27 17:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <stdint.h>

  2. #include <stdio.h>



  3. typedef struct

  4. {

  5.         int year;

  6.         int month;

  7.         int day;

  8.         int hours;

  9.         int minutes;

  10.         int seconds;

  11.         int weekday;

  12. }mytime_t;

  13. mytime_t utctime;



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



  15. /// 返回值:1-7,对应周一到周天

  16. uint8_t GetWeekDayNum(uint32_t year, uint8_t month, uint8_t day)

  17. {

  18.   uint32_t weekday = 0U;



  19.   if (month < 3U)

  20.   {

  21.         /*D = { [(23 x month)/9] + day + 4 + year + [(year-1)/4] - [(year-1)/100] + [(year-1)/400] } mod 7*/

  22.         weekday = (((23U * month) / 9U) + day + 4U + year + ((year - 1U) / 4U) - ((year - 1U) / 100U) + ((year - 1U) / 400U)) % 7U;

  23.   }

  24.   else

  25.   {

  26.         /*D = { [(23 x month)/9] + day + 4 + year + [year/4] - [year/100] + [year/400] - 2 } mod 7*/

  27.         weekday = (((23U * month) / 9U) + day + 4U + year + (year / 4U) - (year / 100U) + (year / 400U) - 2U) % 7U;

  28.   }



  29.   if(weekday == 0)

  30.   {

  31.           weekday = 7;

  32.   }



  33.   return (uint8_t)weekday;

  34. }



  35. void UTCToBeijing(mytime_t* time)

  36. {

  37.         uint8_t days = 0;

  38.         if (time->month == 1 || time->month == 3 || time->month == 5 || time->month == 7 || time->month == 8 || time->month == 10 || time->month == 12)

  39.         {

  40.                 days = 31;

  41.         }

  42.         else if (time->month == 4 || time->month == 6 || time->month == 9 || time->month == 11)

  43.         {

  44.                 days = 30;

  45.         }

  46.         else if (time->month == 2)

  47.         {

  48.                 if ((time->year % 400 == 0) || ((time->year % 4 == 0) && (time->year % 100 != 0))) /* 判断平年还是闰年 */

  49.                 {

  50.                         days = 29;

  51.                 }

  52.                 else

  53.                 {

  54.                         days = 28;

  55.                 }

  56.         }

  57.         time->hours += 8;                 /* 北京时间比格林威治时间快8小时 */

  58.         if (time->hours >= 24)            /* 跨天 */

  59.         {

  60.                 time->hours -= 24;

  61.                 time->day++;

  62.                 if (time->day > days)        /* 跨月 */

  63.                 {

  64.                         time->day = 1;

  65.                         time->month++;

  66.                         if (time->month > 12)    /* 跨年 */

  67.                         {

  68.                                 time->year++;

  69.                         }

  70.                 }

  71.         }

  72.         time->weekday = GetWeekDayNum(time->year, time->month, time->day);  /* 重新计算周 */

  73. }



  74. void GMT_time()

  75. {

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

  77.         utctime.year = 2021;

  78.         utctime.month = 12;

  79.         utctime.day =27;

  80.         utctime.hours = 18;

  81.         utctime.minutes = 2;

  82.         utctime.seconds = 10;

  83.         utctime.weekday = 1;



  84.         //第二步:处理

  85.         UTCToBeijing(&utctime);//处理

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

  88.         Year   =utctime.yea;

  89.         Mon   =utctime.mont;

  90.         Day   =utctime.da;

  91.         Shi    =utctime.hour;

  92.         Fen   =utctime.minutes;

  93.         Miao  =utctime.second;

  94.         Zhou =utctime.weekda;



  95. }



  96. 原文链接:https://blog.csdn.net/qq153471503/article/details/107157470
复制代码

【北京时间=GMT时间+8小时】

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表