在STM32的RTC程序中,关于函数void GregorianDay(struct rtc_time * tm)的问题

在STM32的RTC程序中,关于函数void GregorianDay(struct rtc_time * tm)的问题,第1张

我不知道你要问的和这个函数的关系

这个函数只不过是对闰年与否的日期及星期的处理计算,并没有涉及到1970或者之前,也就是1970之前之后都是可以算的通用程序

而像现在的很多软件如数据库等都会把时间表示成一个长整形数字,这个数字就是从1970年1月1日开始累加的时间。

你看看STM32固件库自带的例程,那里面是借用了一个BKP寄存器保存一个标志的。每次单片机启动时都读取这个标志并判断是不是预先设定的值:如果不是就初始化RTC并设置时间,再设置标志为预期值;如果是预期值就跳过初始化和时间设置,继续执行后面的程序。因此这样保证每次断电后再启动都是正常运行,你是不是没有这样处理?

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(&lt)

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 = 1day >= days_in_month(i)i++) 表示月的i是从1开始的,tm_mon不是从0开始,所以day也要+1. 因为日常表示中没有0月0号,只有1月1号


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7792861.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存