在STM32的RTC程序中, tm->tm_mday = day + 1; 这个日期为什么要加一呢

附加程序:voidto_tm(u32tim,structrtc_time*tm){registeru32i;registerlonghms,day;day=tim/SEC... 附加程序:
void to_tm(u32 tim, struct rtc_time * tm)
{
register u32 i;
register long hms, day;
day = tim / SECDAY;
hms = tim % SECDAY;
/* Hours, minutes, seconds are easy */
tm->tm_hour = hms / 3600;
tm->tm_min = (hms % 3600) / 60;
tm->tm_sec = (hms % 3600) % 60;
/* Number of years in days */
for (i = STARTOFTIME; day >= days_in_year(i); i++) {
day -= days_in_year(i);
}
tm->tm_year = i;
/* Number of months in days left */
if (leapyear(tm->tm_year)) {
days_in_month(FEBRUARY) = 29;
}
for (i = 1; day >= days_in_month(i); i++) {
day -= days_in_month(i);
}
days_in_month(FEBRUARY) = 28;
tm->tm_mon = i;
/* Days are what is left over (+1) from all that. */
tm->tm_mday = day + 1;
/*
* Determine the day of week `
*/
GregorianDay(tm);
}
展开
 我来答
匿名用户
推荐于2018-04-13
展开全部
struct tm是直观意义上的时间表示方法:
struct tm {

  int tm_sec; /* 秒–取值区间为[0,59] */

  int tm_min; /* 分 - 取值区间为[0,59] */

  int tm_hour; /* 时 - 取值区间为[0,23] */

  int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */

  int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */

  int tm_year; /* 年份,其值从1900开始 */

  int tm_wday; /* 星期–取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */

  int tm_yday; /* 从每年的1月1日开始的天数–取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */

  int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/

  long int tm_gmtoff; /*指定了日期变更线东面时区中UTC东部时区正秒数或UTC西部时区的负秒数*/

  const char *tm_zone; /*当前时区的名字(与环境变量TZ有关)*/

  };
程序举例  #include <stdio.h>

  #include <time.h>

  int main(void)

  {

  struct tm *ptr;

  time_t lt;

  lt =time(NULL);

  ptr=localtime(<);

  printf("second:%d\n",ptr->tm_sec);

  printf("minute:%d\n",ptr->tm_min);

  printf("hour:%d\n",ptr->tm_hour);

  printf("mday:%d\n",ptr->tm_mday);

  printf("month:%d\n",ptr->tm_mon+1);

  printf("year:%d\n",ptr->tm_year+1900);

  return 0;

  }
tim 是一个时间计数,是从1900年0分0秒到现在的时间。所以转化从我们日常用的表示一般年要加上1900,月要加上1,而你这里for (i = 1; day >= days_in_month(i); i++) 表示月的i是从1开始的,tm_mon不是从0开始,所以day也要+1. 因为日常表示中没有0月0号,只有1月1号
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式