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的时间给设备时间进行一次校准。

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

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

审核编辑 :李倩

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

    关注

    5056

    文章

    18950

    浏览量

    301493
  • 代码
    +关注

    关注

    30

    文章

    4708

    浏览量

    68176
  • UTC
    UTC
    +关注

    关注

    1

    文章

    24

    浏览量

    14329
收藏 人收藏

    评论

    相关推荐

    嵌入式主板是什么意思?嵌入式主板全面解析

    嵌入式主板,通常被称为嵌入式系统的核心组件,是一种用于控制和数据处理的计算机硬件,其设计旨在嵌入特定设备中执行专门任务。嵌入式主板如同是设备
    的头像 发表于 09-30 10:05 287次阅读

    嵌入式系统的未来趋势有哪些?

    (ML)技术的快速发展,嵌入式系统将更多地整合这些先进技术,以支持智能决策和自动。在设备上直接运行AI和ML模型,进行图像识别、自然语言处理、预测分析等任务,将极大提升嵌入式系统的智
    发表于 09-12 15:42

    现场直击 | 飞凌嵌入式亮相2024上海国际嵌入式

    6月12日,2024上海国际嵌入式展(embedded world China 2024)在上海世博展览馆开幕。飞凌嵌入式不仅展出了基于NXP、TI和瑞萨等国际厂商芯片打造的
    的头像 发表于 06-13 14:13 939次阅读
    现场直击 | 飞凌<b class='flag-5'>嵌入式</b>亮相2024上海<b class='flag-5'>国际</b><b class='flag-5'>嵌入式</b>展

    embedded world China 2024上海国际嵌入式展 智慧赋能,科技全球!国际嵌入式产业菁英再聚上海

    2024年6月12日——为期三天的第二届embedded world China 上海国际嵌入式展览及会议上海世博展览馆3号馆再次举办!在全球AI盛行的数字浪潮来袭的今天,尤其是足以改变
    发表于 06-12 11:17 296次阅读

    芯原亮相2024上海国际嵌入式大会

    6月12日上午,在2024上海国际嵌入式展(Embedded World China)同期举办的上海国际嵌入式大会上,芯原股份创始人、董事长兼总裁戴伟民博士将以“Chiplet构建高效
    的头像 发表于 06-11 10:54 798次阅读

    下周见!飞凌嵌入式即将亮相2024上海国际嵌入式

    2024上海国际嵌入式展(embeddedworldChina2024),即将于6月12日~14日在上海世博展览馆举行。届时,飞凌嵌入式将携多款前沿的嵌入式主控产品及热门行业解决方案D
    的头像 发表于 06-07 08:02 556次阅读
    下周见!飞凌<b class='flag-5'>嵌入式</b>即将亮相2024上海<b class='flag-5'>国际</b><b class='flag-5'>嵌入式</b>展

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

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

    什么是嵌入式微处理器?嵌入式微处理器有哪些?

    嵌入式微处理器是指嵌入到特定应用系统中的微处理器,它是整个嵌入式系统的核心,由通用处理器演变而来,具有体积小、重量轻、成本低、可靠性高等优点
    的头像 发表于 03-29 11:39 888次阅读

    嵌入式微处理器的原理和应用

    嵌入式微处理器是专为嵌入式系统设计的微处理器,它们是嵌入式系统的核心组件,负责执行程序指令、处理数据和控制其他硬件设备。与通用微
    的头像 发表于 03-28 15:51 780次阅读

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

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

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

    **国际化部件**为应用提供了一系列国际化接口,包括:时间日期格式、数字格式、月份星期格式
    的头像 发表于 03-21 22:07 277次阅读
    鸿蒙实战开发:【<b class='flag-5'>国际化</b>部件】

    嵌入式fpga是什么意思

    嵌入式FPGA是指将FPGA技术集成到嵌入式系统中的一种解决方案。嵌入式系统是一种为特定应用而设计的计算机系统,它通常包括处理器、内存、外设接口等组件,并且被
    的头像 发表于 03-15 14:29 1150次阅读

    嵌入式学习步骤

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

    嵌入式处理器简介和种类

    嵌入式处理器是嵌入式系统的核心,是控制、辅助系统运行的硬件单元。范围极其广阔,从最初的4位处理器,目前仍在大规模应用的8位单片机,到最新的受到广泛青睐的32位,64位
    的头像 发表于 12-26 12:26 937次阅读

    如何设置VS代码配置来调试嵌入式处理

    是通过单击一个按钮,之后魔法在后台发生。在VS Code中,如果您单击调试按钮,您可能会收到没有配置好的反馈。在这篇文章中,我们将了解如何设置VS代码配置来调试嵌入式处理器。
    的头像 发表于 12-05 11:08 1247次阅读
    如何设置VS<b class='flag-5'>代码</b>配置来调试<b class='flag-5'>嵌入式</b><b class='flag-5'>处理</b>器