0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

写国际化的嵌入式代码,时间问题如何处理?

大鱼机器人 来源:大鱼机器人 作者:大鱼机器人 2022-11-14 15:48 次阅读

写国际化的程序比较难处理的两个问题可能是:时间问题编码问题

本篇文章来聊一聊时间问题。

最近设备到了国外,时间不不准了~

杂烩君一直在东八区写代码,处理时间问题时,习惯性的把时区写死为东八区,即设备的小时数总是基于GMT的小时数加上8个小时作为设备的小时数。

如果设备到了国外,设备的时间就不准了,设备的小时数对不上当地的小时数。我们的设备时间,是使用设备上GPS的授时时间给设备进行时间校准的。

设备从GPS拿到的时间数据只是UTC时间。所以,不同地区的时间,需要基于UTC时间+/-时区,向西减小,向东增加。当地的时区,可以根据当地的经度进行计算,这个后面再说。

下面我们先来了解一些概念:

GMT与UTC时间

GMT时间(Greenwich Mean Time,格林威治时间),之前作为全球时间的基准参考时间。

UTC时间(Universal Time Coordinated, 世界标准时间或世界协调时间),以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。UTC是基于标准的GMT提供的准确时间。

UTC时间和GMT时间其实是同一个时间,只不过UTC时间用秒来表示。

1、获取UTC时间

获取UTC时间的接口

#include
time_ttime(time_t*tloc);

该接口返回1970-01-01 0000 +0000至今的秒数(UTC)。

使用例子:

#include
#include

time_tget_utc_time(void)
{
returntime(NULL);
}

intmain(intargc,char**argv)
{
time_tutc_time=get_utc_time();
printf("utc_time=%lds
",utc_time);

return0;
}

运行结果:

ed8195b0-632a-11ed-8abf-dac502259ad0.png

2、获取GMT时间

获取GMT时间的接口:

#include
structtm*gmtime(consttime_t*timep);

该接口返回tm结构的GMT时间(UTC时间)。

tm结构:

structtm
{
inttm_sec;/*Seconds(0-60)*/
inttm_min;/*Minutes(0-59)*/
inttm_hour;/*Hours(0-23)*/
inttm_mday;/*Dayofthemonth(1-31)*/
inttm_mon;/*Month(0-11)*/
inttm_year;/*Year-1900*/
inttm_wday;/*Dayoftheweek(0-6,Sunday=0)*/
inttm_yday;/*Dayintheyear(0-365,1Jan=0)*/
inttm_isdst;/*Daylightsavingtime*/
};

使用例子:

#include
#include

time_tget_utc_time(void)
{
returntime(NULL);
}

intmain(intargc,char**argv)
{
time_tutc_time=get_utc_time();
printf("utc_time=%lds
",utc_time);

structtm*gmt_tm=gmtime(&utc_time);
printf("gmttime=%.4d-%.2d-%.2d%.2d:%.2d:%.2d
",gmt_tm->tm_year+1900,
gmt_tm->tm_mon+1,
gmt_tm->tm_mday,
gmt_tm->tm_hour,
gmt_tm->tm_min,
gmt_tm->tm_sec);

return0;
}

运行结果:

ed95b108-632a-11ed-8abf-dac502259ad0.png

时区

由于世界各国家与地区经度不同,地方时区也有所不同,因此会划分为不同的时区。

正式的时区划分包括24个时区,每一时区由一个英文字母表示。每隔经度15°划分一个时区,有一个例外,每个时区有一条中央子午线。

1、时区划分方法:

现今全球共分为24个时区。英国(格林尼治天文台旧址)为中时区(零时区)、东1—12区,西1—12区。每个时区横跨经度15度,时间正好是1小时。最后的东、西第12区各跨经度7.5度,以东、西经180度为界。每个时区的中央经线上的时间就是这个时区内统一采用的时间,称为区时,相邻两个时区的时间相差1小时。

2、经度范围:

eda9a8ac-632a-11ed-8abf-dac502259ad0.png

3、当地时区计算

需要用到的接口:

#include
structtm*localtime(consttime_t*timep);

计算当地时区:

#include
#include

time_tget_utc_time(void)
{
returntime(NULL);
}

intmain(intargc,char**argv)
{
time_tutc_time=get_utc_time();
printf("utc_time=%lds
",utc_time);

structtm*gmt_tm=gmtime(&utc_time);
printf("gmttime=%.4d-%.2d-%.2d%.2d:%.2d:%.2d
",gmt_tm->tm_year+1900,
gmt_tm->tm_mon+1,
gmt_tm->tm_mday,
gmt_tm->tm_hour,
gmt_tm->tm_min,
gmt_tm->tm_sec);
intgmt_hour=gmt_tm->tm_hour;

structtm*local_tm=localtime(&utc_time);
printf("localtime=%.4d-%.2d-%.2d%.2d:%.2d:%.2d
",local_tm->tm_year+1900,
local_tm->tm_mon+1,
local_tm->tm_mday,
local_tm->tm_hour,
local_tm->tm_min,
local_tm->tm_sec);
intlocal_hour=local_tm->tm_hour;


intlocal_time_zone=local_hour-gmt_hour;
if(local_time_zone< -12)
{
local_time_zone+=24;
}
elseif(local_time_zone>12)
{
local_time_zone-=24;
}else{}

printf("local_time_zone=%d
",local_time_zone);

return0;
}

我们当前为北京时间:

edbdd0f2-632a-11ed-8abf-dac502259ad0.png

我们把Ubuntu时间日期里的地点改到其它国家:

edee3fe4-632a-11ed-8abf-dac502259ad0.pngeeab8a36-632a-11ed-8abf-dac502259ad0.png

CST 时间

CST (China Standard Time,中国标准时间)。

中国标准时间一般指北京时间。北京时间是中国采用国际时区东八时区的区时作为标准时间。而中国幅员辽阔,东西相跨5个时区(即东五区、东六区、东七区、东八区、东九区5个时区)

“北京时间”适用于中国(大陆、港澳、台湾)境内,但在大陆的新疆、西藏等地,政府机关、企事业单位作息时间和邮政通讯费用优惠分界点虽然用北京时间来表示,但也比其他各省延晚2小时,使用UTC+6的情况更为普遍。

根据经度计算时区

时区范围是中央经线的度数向左右分别减、加7.5度。用该地的经度除以15度,当余数小于7.5度时,商数即为该地所在的时区数,当余数大于7.5度时,商数加1即为该地所在的时区数。

#include
#include

intcalc_timezone(doublelongitude)
{
inttimezone=0;
intquotient=(int)(longitude/15);
doubleremainder=(longitude-quotient*15);
printf("quotient=%d,remainder=%lf
",quotient,remainder);

if(remainder<= 7.5)
{
timezone=quotient;
}
else
{
timezone=quotient+(quotient>=0?+1:-1);
}

returntimezone;
}

intmain(intargc,char**argv)
{
while(1)
{
doublelongitude=0.0;
printf("pleaseinputlongitude:");
scanf("%lf",&longitude);
printf("longitude=%lf
",longitude);
inttimezone=calc_timezone(longitude);
printf("timezone=%d
",timezone);
}

return0;
}

这其实也是百度百科上提供的思路:

eecbebfa-632a-11ed-8abf-dac502259ad0.png

这种方式至少可以计算得到时区中心线的时区数,但是一些临界情况可能会差1小时。在网络上也没有找到其它更好的解决方案。

设备的时间,如果只是作为一个显示功能,影响可能不是很大,但是如果设备的时间来做其它事情,比如定时功能,定时多少点多少分做什么事情,影响就很大了。

对于我们的设备,定时功能使用手机APP来操作的,这时候能想到的比较好的方法就是每当使用手机APP的时候,把手机APP的时间给设备时间进行一次校准。

大家是否有其它更好的解决方案,欢迎留言讨论

如果觉得文章有帮助,麻烦帮忙转发,谢谢!

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4983

    文章

    18297

    浏览量

    288624
  • 代码
    +关注

    关注

    30

    文章

    4557

    浏览量

    66822
  • UTC
    UTC
    +关注

    关注

    1

    文章

    24

    浏览量

    14127
收藏 人收藏

    评论

    相关推荐

    嵌入式热门发展方向有哪些?

    嵌入式热门发展方向有哪些? 现在越来越多的计算机、电子、通信、自动等相关专业跨行学习嵌入式嵌入式开发作为未来职业发展的方向,不论从薪资待遇还是发展前景来看,都非常不错。 在
    发表于 04-11 14:17

    如何成为一名嵌入式C语言高手?

    系统中,如何调试和优化程序,如何处理实时性要求等。同时,还可以学习如何使用调试工具和硬件仿真器来辅助调试和测试。 四、积极参与开源项目和技术社区加入一些嵌入式开源项目的社区,与其他开发者交流经验
    发表于 04-07 16:03

    如何成为一名嵌入式C语言高手?

    系统中,如何调试和优化程序,如何处理实时性要求等。同时,还可以学习如何使用调试工具和硬件仿真器来辅助调试和测试。 四、积极参与开源项目和技术社区加入一些嵌入式开源项目的社区,与其他开发者交流经验
    发表于 03-25 14:12

    鸿蒙实战开发:【国际化部件】

    **国际化部件**为应用提供了一系列国际化接口,包括:时间日期格式化、数字格式化、月份星期格式化、单复数、度量衡等相关接口。基于这些国际化接口,开发者可以设计并实现具有良好
    的头像 发表于 03-21 22:07 105次阅读
    鸿蒙实战开发:【<b class='flag-5'>国际化</b>部件】

    嵌入式系统发展前景?

    的发展前景也十分广阔。 随着物联网和智能设备的快速发展,嵌入式系统将更为普遍地应用于各种设备和设施,包括家用电器、医疗设备、交通工具等。这些设备将通过嵌入式系统实现智能、网络,从而
    发表于 02-22 14:09

    嵌入式软件开发应该掌握哪些知识?

    嵌入式软件开发应该掌握哪些知识? 一、 什么是嵌入式软件? 嵌入式软件通常是指嵌入式系统中运行的软件,嵌入式系统是一种特殊的计算机系统,通常
    发表于 02-19 11:23

    嵌入式学习步骤

    语言编写。但是,有些嵌入式系统也使用其他编程语言,例如Python或Java。 (3).了解硬件:深入了解您要控制的硬件设备的功能和特性。您需要了解嵌入式系统的处理器、内存、I/O端口、传感器和其他
    发表于 02-02 15:24

    从事嵌入式工作有哪些优势?

    。 那么从事嵌入式工作有哪些优势? 一是工作强度相对较低。开发企业应用软件的IT企业,这个用户的系统搞完了,又得去搞下一个用户的,而且每个用户的需求和完成时间都不同,开发人员往往疲于奔命,重复劳动
    发表于 10-08 15:05

    芯海科技群芯闪耀2023上海国际嵌入式

    6月14日,为期三天的2023上海国际嵌入式展(embeddedworldChina2023)在上海世博展览馆隆重开幕。这是全球知名展事活动德国嵌入式展(embeddedworld)在中国的首次亮相
    的头像 发表于 07-31 17:56 349次阅读
    芯海科技群芯闪耀2023上海<b class='flag-5'>国际</b><b class='flag-5'>嵌入式</b>展

    飞凌嵌入式亮相embedded world上海国际嵌入式展!

    嵌入式
    飞凌嵌入式
    发布于 :2023年06月16日 16:22:01

    中国首颗ARM+RISC-V异构多核MCU伴随IAR在上海国际嵌入式展亮相

    6月14日,2023上海国际嵌入式展在上海世博展览馆3号馆盛大开幕。随着数字与智能时代的到来,嵌入式产业在中国迅速崛起,新型的产业形态吸引越来越多的中国企业进入新的业务板块,展会涵盖
    发表于 06-15 18:32

    飞凌嵌入式亮相上海国际嵌入式

    6月14日,备受行业关注的“Embedded World China上海国际嵌入式展”正式拉开帷幕,这是德国Embedded World品牌首次进入中国市场,旨在为国内嵌入式行业高质量供应商与尖端
    的头像 发表于 06-15 17:54 349次阅读
    飞凌<b class='flag-5'>嵌入式</b>亮相上海<b class='flag-5'>国际</b><b class='flag-5'>嵌入式</b>展

    共筑嵌入式处理未来,德州仪器亮相上海国际嵌入式

    嵌入式技术和产品,亮相于上海世博展览馆举办的 2023 年上海国际嵌入式展 (embedded world China)。德州仪器的模拟和嵌入式
    发表于 06-15 08:35 243次阅读
    共筑<b class='flag-5'>嵌入式</b><b class='flag-5'>处理</b>未来,德州仪器亮相上海<b class='flag-5'>国际</b><b class='flag-5'>嵌入式</b>展

    嵌入式用什么语言编程?

    、结构等方面对C进行了卓有成效的改进,但是在程序代码容量、执行速度和程序复杂程度等方面比C语言程序性能差一些。 当然也有很多学员或是已经就业的学员说,嵌入式技术中应用多的语言编程是C/C++两种。具体会应用哪种编程语言得根据从
    发表于 05-18 10:08

    德州仪器将亮相上海国际嵌入式

    一场嵌入式行业的盛会就将在上海世博展览馆拉开帷幕!德州仪器 (TI) 也将重磅亮相本届上海国际嵌入式展。这个六月,与您不见不散! 上海国际嵌入式
    的头像 发表于 05-15 10:24 1363次阅读