年月日时分秒转时间戳C语言代码

文章提供了两种不同的C语言实现方式,将DATE_STRUCT类型的日期转换为从1970年开始的秒数(时间戳)。第一种方法逐层计算年、月、日、时、分、秒,考虑了闰年的天数。第二种方法使用预计算的每月天数,并假设所有年份都是闰年,然后在必要时进行调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试记录

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对比网站

补充说明:这个网站转时间戳有点坑!

https://tool.lu/timestamp/

源文件

const uint8_t uDaysPerMonth[13]= { 0,31,28,31,30,31,30 ,
                              31,31,30,31,30,31
                            };
uint32_t RTC_DecodeSec(DATE_STRUCT* pdate , int32_t offset )
{
    uint32_t Seconds;
    uint16_t uYear,usYear ;
    uint8_t  uMonth;
    uint8_t  feb_days = 28 ;
    Seconds = 0;

    usYear = (uint16_t)pdate->year + BEGIN_YEAR ;
    for(uYear = BEGIN_YEAR; uYear < usYear; uYear++)
    {
        Seconds += (uint32_t)DAYS_PER_YEAR(uYear)*SECONDS_PER_DAY;
    }
    if(IS_LEAPYEAR(uYear))
        feb_days = 29 ;
    for(uMonth = 1; uMonth < pdate->month; uMonth++)
    {
        if(uMonth == 2)
        {
            Seconds += (uint32_t)((uint32_t)feb_days * SECONDS_PER_DAY) ;
        } else
        {
            Seconds += (uint32_t)((uint32_t)uDaysPerMonth[uMonth]*SECONDS_PER_DAY);
        }
    }
    Seconds += (uint32_t)(((uint32_t)pdate->day-1)*SECONDS_PER_DAY);
    Seconds += (uint32_t)((uint32_t)pdate->hour*(uint32_t)3600);
    Seconds += (uint32_t)((uint32_t)pdate->min*60);
    Seconds += (uint32_t)((uint32_t)pdate->sec);
    {
      Seconds += offset ; 
    }
    return (Seconds);
}

头文件

#define BEGIN_YEAR    1970
#define SECONDS_PER_DAY     86400
#define IS_LEAPYEAR(y)  (((0 == (y) % 4) && (0 != (y) % 100)) || (0 == (y) % 400))
#define DAYS_PER_YEAR(y)    (IS_LEAPYEAR(y)? 366 : 365)
typedef struct 
{
  uint8_t  min;
  uint8_t  hour;
  uint8_t  day;
  uint8_t  month;
  uint8_t  year;
  uint8_t  sec;
} DATE_STRUCT;

补充

在这里插入图片描述

第二种实现方法

#define MINUTE 60
#define HOUR (60*MINUTE)
#define DAY (24*HOUR)
#define YEAR (365*DAY)

/* interestingly, we assume leap-years */
static int month[12] = {
	0,
	DAY*(31),
	DAY*(31+29),
	DAY*(31+29+31),
	DAY*(31+29+31+30),
	DAY*(31+29+31+30+31),
	DAY*(31+29+31+30+31+30),
	DAY*(31+29+31+30+31+30+31),
	DAY*(31+29+31+30+31+30+31+31),
	DAY*(31+29+31+30+31+30+31+31+30),
	DAY*(31+29+31+30+31+30+31+31+30+31),
	DAY*(31+29+31+30+31+30+31+31+30+31+30)
};
struct tm
{
    uint32_t tm_sec;   // seconds after the minute - [0, 60] including leap second
    uint32_t tm_min;   // minutes after the hour - [0, 59]
    uint32_t tm_hour;  // hours since midnight - [0, 23]
    uint32_t tm_mday;  // day of the month - [1, 31]
    uint32_t tm_mon;   // months since January - [0, 11]
    uint32_t tm_year;  // years since 1900
};
uint32_t kernel_mktime(struct tm * tm)
{
	uint32_t res;
	uint32_t year;

	year = tm->tm_year - 70;
/* magic offsets (y+1) needed to get leapyears right.*/
	res = YEAR*year + DAY*((year+1)/4);
	res += month[tm->tm_mon];
/* and (y+2) here. If it wasn't a leap-year, we have to adjust */
	if (tm->tm_mon>1 && ((year+2)%4))
		res -= DAY;
	res += DAY*(tm->tm_mday-1);
	res += HOUR*tm->tm_hour;
	res += MINUTE*tm->tm_min;
	res += tm->tm_sec;
	return res;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值