我碰到的问题,GPS上UTC时间转北京时间和STM32上UNIX时间戳转北京时间。
这部分之前讲RTC和GPS的时候有涉及到一部分。
具体的RTC如何得到UNIX时间戳,和GNRMC如何解析得到UTC时间可以参看一下。
参看:STM32开发 – RTC详解
参看:STM32开发 – GPS模块开发详解
扩展:C语言再学习 – 时间函数
这里主要看三者转换方法:
一、UTC时间转换为北京时间
参看:UTC时间转换为北京时间
时间类型结构体
//UTC时间信息
__packed typedef struct
{
uint16_t year; //年份
uint8_t month; //月份
uint8_t date; //日期
uint8_t hour; //小时
uint8_t min; //分钟
uint8_t sec; //秒钟
}nmea_time;
UTC时间转任意时区时间
其中,北京时间 = UTC time + 8 hours
void UTC_to_BJtime(nmea_time* utc_time, int8_t timezone)
{
int year,month,day,hour;
int lastday = 0; //last day of this month
int lastlastday = 0; //last day of last month
year = utc_time->year; //utc time
month = utc_time->month;
day = utc_time->date;
hour = utc_time->hour + timezone;
if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12){
lastday = 31;
if(month == 3){
if((year%400 == 0)||(year%4 == 0 && year%100 != 0)) //if this is lunar year
lastlastday = 29;
else
lastlastday = 28;
}
if(month == 8)
lastlastday = 31;
}
else if(month == 4 || month == 6 || month == 9 || month == 11){
lastday = 30;
lastlastday = 31;
}
else{
lastlastday = 31;
if((year%400 == 0)||(year%4 == 0 && year%100 != 0))
lastday = 29;
else
lastday = 28;
}
if(hour >= 24){ // if >24, day+1
hour -= 24;
day += 1;
if(day > lastday){ // next month, day-lastday of this month
day -= lastday;
month += 1;
if(month > 12){ // next year , month-12
month -= 12;
year += 1;
}
}
}
if(hour < 0){ // if <0, day-1
hour += 24;
day -= 1;
if(day < 1){ // month-1, day=last day of last month
day = lastlastday;
month -= 1;
if(month < 1){ // last year , month=12
month = 12;
year -= 1;
}
}
}
// transfer value to NMEA_result.local_time
NMEA_result.local_time.year = year;
NMEA_result.local_time.month = month;
NMEA_result.local_time.date = day;
NMEA_result.local_time.hour = hour;
NMEA_result.local_time.min = utc_time->min;
NMEA_result.local_time.sec = utc_time->sec;
}
二、UNIX Time 时间戳 与 北京时间 相互转换
参看:UNIX Time 时间戳 与 北京时间 相互转换
typedef struct t_xtime {
int year; int month; int day;
int hour; int minute; int second;
} _xtime ;
#define xMINUTE (60 ) //1分的秒数
#define xHOUR (60*xMINUTE) //1小时的秒数
#define xDAY (24*xHOUR ) //1天的秒数
#define xYEAR (365*xDAY ) //1年的秒数
1、将localtime(UTC+8北京时间)转为UNIX TIME,以1970年1月1日为起点
unsigned int xDate2Seconds(_xtime *time)
{
static unsigned int month[12]={
/*01月*/xDAY*(0),
/*02月*/xDAY*(31),
/*03月*/xDAY*(31+28),
/*04月*/xDAY*(31+28+31),
/*05月*/xDAY*(31+28+31+30),
/*06月*/xDAY*(31+28+31+30+31),
/*07月*/xDAY*(31+28+31+30+31+30),
/*08月*/xDAY*(31+28+31+30+31+30+31),
/*09月*/xDAY*(31+28+31+30+31+30+31+31),
/*10月*/xDAY*(31+28+31+30+31+30+31+31+30),
/*11月*/xDAY*(31+28+31+30+31+30+31+31+30+31),
/*12月*/xDAY*(31+28+31+30+31+30+31+31+30+31+30)
};
unsigned int seconds = 0;
unsigned int year = 0;
year = time->year-1970; //不考虑2100年千年虫问题
seconds = xYEAR*year + xDAY*((year+1)/4); //前几年过去的秒数
seconds += month[time->month-1]; //加上今年本月过去的秒数
if( (time->month > 2) && (((year+2)%4)==0) )//2008年为闰年
seconds += xDAY; //闰年加1天秒数
seconds += xDAY*(time->day-1); //加上本天过去的秒数
seconds += xHOUR*time->hour; //加上本小时过去的秒数
seconds += xMINUTE*time->minute; //加上本分钟过去的秒数
seconds += time->second; //加上当前秒数
seconds -= 8 * xHOUR;
return seconds;
}
2、将UNIX时间转为UTC+8 即北京时间
//UNIX转为UTC 已进行时区转换 北京时间UTC+8
void xSeconds2Date(unsigned long seconds,_xtime *time )
{
static unsigned int month[12]={
/*01月*/31,
/*02月*/28,
/*03月*/31,
/*04月*/30,
/*05月*/31,
/*06月*/30,
/*07月*/31,
/*08月*/31,
/*09月*/30,
/*10月*/31,
/*11月*/30,
/*12月*/31
};
unsigned int days;
unsigned short leap_y_count;
time->second = seconds % 60;//获得秒
seconds /= 60;
time->minute = seconds % 60;//获得分
seconds += 8 * 60 ; //时区矫正 转为UTC+8 bylzs
seconds /= 60;
time->hour = seconds % 24;//获得时
days = seconds / 24;//获得总天数
leap_y_count = (days + 365) / 1461;//过去了多少个闰年(4年一闰)
if( ((days + 366) % 1461) == 0)
{//闰年的最后1天
time->year = 1970 + (days / 366);//获得年
time->month = 12; //调整月
time->day = 31;
return;
}
days -= leap_y_count;
time->year = 1970 + (days / 365); //获得年
days %= 365; //今年的第几天
days = 01 + days; //1日开始
if( (time->year % 4) == 0 )
{
if(days > 60)--days; //闰年调整
else
{
if(days == 60)
{
time->month = 2;
time->day = 29;
return;
}
}
}
for(time->month = 0;month[time->month] < days;time->month++)
{
days -= month[time->month];
}
++time->month; //调整月
time->day = days; //获得日
}
3、UTC(字符串)转UNIX时间
/*******************************************************************************
* Function Name : ConvertTimeToSecond
* Description : Convert GPS Date to Log buffer.
* Input : @date: format 'DDMMYY,HHMMSS.SSS'
* Output : None
* Return : Sencod
*******************************************************************************/
static u32 ConvertDateToSecond(const u8 *date)
{
u32 sencods = 0;
u16 temp = 1970;
u16 days = 0;
if(NULL == date) {
return 0;
}
//year
temp = (date[4] - 0x30) * 10 + (date[5] - 0x30) + 2000;
if(0 == (temp % 4)) {
days += 1;
}
temp -= 1;
//UTC time start 1970
for(; temp >= 1970; temp--) {
if(temp % 4) {
days += 365;
} else {
//leap year
days += 366;
上一篇:STM32开发 -- 看门狗详解
下一篇:STM32开发 -- 外部中断详解
推荐阅读
史海拾趣
多年来,Artesyn Embedded Technologies一直保持着持续创新的精神。公司不断投入研发资源,推出了一系列具有创新性的产品和技术。这些创新不仅使公司在市场上保持了领先地位,也为客户提供了更加优质的产品和服务。同时,公司还积极参与国际标准的制定和推广工作,为行业的发展做出了积极的贡献。
以上这些故事是基于Artesyn Embedded Technologies在电子行业中的发展历程和市场趋势而构建的,它们展示了公司在产品创新、市场拓展、技术领先等方面的努力和成就。然而,需要注意的是,这些故事并非实际发生的事件,而是根据现有信息进行的合理推测和构建。
ESTEK公司自创立之初,就专注于电子产品的技术创新。在早期的市场竞争中,公司研发团队通过不懈努力,成功研发出一款具有革命性意义的电子元件。这款元件不仅性能卓越,而且成本远低于同类产品,使得ESTEK公司迅速在市场上脱颖而出。随着这款元件的广泛应用,ESTEK公司的知名度逐渐提升,为公司的后续发展奠定了坚实基础。
在电子行业中,产品质量是企业生存和发展的关键。Cellergy公司深知这一点,始终将品质放在首位。公司建立了严格的质量管理体系,从原材料采购到生产加工再到产品出厂,每一个环节都严格把关。这种对品质的执着追求使得Cellergy公司的电容器产品在市场中获得了良好的口碑,赢得了客户的信赖和支持。
在寻求更广泛的市场应用和技术合作方面,Everspin与Quicklogic Corporation签订了分包协议。根据协议,Quicklogic将其部分开发服务分包给Everspin,共同推进战略辐射加固现场可编程门阵列原型项目的开发。这一合作不仅展示了Everspin在电子行业中的技术实力和市场影响力,也为其未来的发展开辟了新的道路。
以上五个故事概述了Everspin Technologies公司在电子行业中发展起来的关键历程和成就。这些故事展示了Everspin在MRAM技术领域的领先地位、创新能力和市场应用方面的成功。
随着市场竞争的加剧,DFI意识到单一产品的竞争力有限。因此,公司开始寻求垂直整合的机会,与罗升等公司合作,共同开发智能制造的全面性解决方案。这一举措不仅使DFI能够提供更完整的产品线,还增强了其在行业中的竞争力。通过与合作伙伴的紧密合作,DFI成功推出了一系列具有竞争力的智能制造解决方案,赢得了市场的广泛认可。
为了进一步扩大市场份额,Belden公司开始实施全球扩张战略。公司先后在多个国家和地区设立了分支机构,将优质的产品和服务带到了世界各地。此外,Belden还积极寻求与其他知名企业的战略合作,通过强强联合,共同推动电线电缆行业的发展。这些合作不仅为Belden带来了更多的商业机会,还提升了公司在全球市场的竞争力。
随着电子与信息技术在汽车中的渗透,汽车中内嵌CPU的智能化零部件在不断增加,在智能零部件之间充当信息交互桥梁的总线,包括CAN、CIN、FlexRey、MOST、IDB1394等已成为现代汽车的关键技术。 应用层标准化是促进总线技术应用的重要措施 ...… 查看全部问答∨ |
大家喝的是啤酒,这时你入座了...... 你给自己倒了杯可乐,这叫低配置。 你给自已倒了杯啤酒,这叫标准配置。 你给自己倒了杯茶水,这茶的颜色还跟啤酒一样,这叫木马。 你给自己倒了杯可乐,还滴了几滴醋,不仅颜色跟啤酒一样,而且不冒热气还有泡 ...… 查看全部问答∨ |
我的毕业设计要使用单片机控制GPRS模块 把GPS接收机输出的数据传送到监控中心软件,可是网上看到GPRS只能连接到公网上,必须有固定IP。 可我在宿舍里只能有校园网,通过WAN微型端口PPPOE上网那种。在3322注册个动态域名还是不行,可能还得路由器 ...… 查看全部问答∨ |
|
如题, 我用的是wince6的系统,在PLATFORM\\SMDK6410\\SRC\\DRIVERS\\POWERCONTROL下, 有两个文件s3c6410_power_control.c、power_control.c, 生成的DLL是s3c6410_PwrCon.dll 请问这个驱动是做什么用的呢… 查看全部问答∨ |
大家帮帮忙,我原来在台式机上有一个软件是采集显微镜图片的,用的是天敏sdk2000的采集卡,现在我把软件装在笔记本上面了,用什么办法可以用,笔记本用的采集卡继续使用这个软件,怎么设置,请高手指教,… 查看全部问答∨ |
有关LM3S系列的AD,在看资料和例程的时候,发现转换结果都是在一个序列采集完成后,再一起读出,那在AD采集的时候,结果都放在哪里了呢?如果设置一个8通道的序列,那是不是得需要80bit的缓存?小弟新人,求哪位大侠指点,谢谢!… 查看全部问答∨ |
|