时间戳转北京时间,C语言实现
#include “stdio.h”
#define u8 unsigned char
#define u16 unsigned short
#define u32 unsigned int
//判断是不是闰年函数
//月份 1 2 3 4 5 6 7 8 9 10 11 12
//闰年 31 29 31 30 31 30 31 31 30 31 30 31
//非闰年 31 28 31 30 31 30 31 31 30 31 30 31
//输入:年份
//输出:该年份是否是闰年.1,是.0,不是
u8 Is_Leap_Year(u16 year)
{
if(year%40) //必须能被4整除
{
if(year%1000)
{
if(year%4000)return 1;//若是以00结尾,还要能被400整除
else return 0;
}else return 1;
}else return 0;
}
//设置时钟
//把输入的时钟转换为秒钟
//以1970年1月1日为基准
//1970~2099年为合法年份
//返回值:0,成功;其余:错误代码.
//月份数据表
u8 const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表
//平年的月份日期表
const u8 mon_table[12]={31,28,31,30,31,30,31,31,30,31,30,31};
u32 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)
{
u16 t;
u32 seccount=0;
if(syear<1970||syear>2099)return 1;
for(t=1970;t
{
if(Is_Leap_Year(t))seccount+=31622400;//闰年的秒钟数
else seccount+=31536000; //平年的秒钟数
}
smon-=1;
for(t=0;t
{
seccount+=(u32)mon_table[t]*86400;//月份秒钟数相加
if(Is_Leap_Year(syear)&&t1)seccount+=86400;//闰年2月份增长一天的秒钟数
}
seccount+=(u32)(sday-1)86400;//把前面日期的秒钟数相加
seccount+=(u32)hour3600;//小时秒钟数
seccount+=(u32)min*60; //分钟秒钟数
seccount+=sec;//最后的秒钟加上去web
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);//使能PWR和BKP外设时钟
//PWR_BackupAccessCmd(ENABLE);//使能RTC和后备寄存器访问
//RTC_SetCounter(seccount);//设置RTC计数器的值
//RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操做完成
seccount-=28800;
return seccount;
}
void main()
{
u32 Time_count;
u8 timeg_H,timeg_L,timed_h,timed_l;
Time_count=RTC_Set(2019,7,22,9,32,55);
printf(“时间戳为=%ld\n”,Time_count);
timeg_H=(u8)(Time_count>>24);
timeg_L=(u8)( (Time_count>>16)&0x00ff );
timed_h=(u8) ( (Time_count>>8)&0x0000ff);
timed_l=(u8) (Time_count&0x000000ff);
printf(“timeg_H=%x ,timeg_L=%x,timed_h=%x,timed_l=%x,\n”,timeg_H,timeg_L,timed_h,timed_l);
printf(“timeg_H=%d ,timeg_L=%d,timed_h=%d,timed_l=%d,\n”,timeg_H,timeg_L,timed_h,timed_l);svg
}函数