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






审核编辑:刘清

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

    关注

    22

    文章

    2735

    浏览量

    164073
  • UTC
    UTC
    +关注

    关注

    1

    文章

    24

    浏览量

    14114
收藏 人收藏

    评论

    相关推荐

    Qt多国语言(国际化)问题小结

    的需求,笔者就教学与项目开发中的经历,小结了Qt多国语言(国际化)问题,仅供参考。 假设我们已经建好个工程,且可以运行出基本的界面。1、打开项目工程文件QTDemo.pro,添加如下语句
    发表于 05-18 10:35

    Linux 下用UDP实现群聊单

    Linux 下用UDP实现群聊单,能够实现单和群聊。程序不长,可以作为学习网络的检测。
    发表于 07-19 23:37

    兼职程序

    有没有兼职Labview程序的?最好是深圳的,涉及方面:1、力量传感器力量采集2、运动控制(X/Y/Z/R最多4轴,轴居多)3、用于设备控制4、长期合作为佳5、时间能自由支配最好如
    发表于 06-08 11:01

    下阻抗匹配

    下阻抗匹配,电路加个阻抗匹配网络,搞成和负载样的阻抗,这样岂不是多了个假负载?不是损耗了效率吗?而事实上刚好相反,哪个坛友分析下缘故
    发表于 10-31 17:55

    Altium中Fill,Polygon Pour,Plane的区别和用法

    Fill会造成短路,为什么还用它呢?来Altium中Fill,Polygon Pour,Plane的区别和用法
    发表于 04-25 06:29

    你知道的和不知道的电流镜

    这期来点轻松的,你知道的和不知道的电流镜。电流源可算是模拟集成电路中最基础的内容,也是有很多花样的基本单元。电流源是笼统的叫法,具体会根据电流的流向,分别叫做电流源(Current
    发表于 06-24 06:56

    stm32的低功耗调试

    前言:物联网的大部分设备都是电池供电的,设备本身低功耗对延长设备使用至关重要,今天就实际调试总结stm32的低功耗调试。1、stm32在运行状态下的功耗上图截图自stm32l15x手册
    发表于 08-11 08:18

    7系列FPGA的供电部分

    前几篇咱们说了FPGA内部逻辑,本篇咱们再聊7系列FPGA的供电部分。首先咱们说spartan7系列,通常咱们需要使用以下电源轨:1,VCCINTFPGA内部核心电压。其不损坏FPGA器件的范围
    发表于 11-11 09:27

    下GS的波形

    对于咱们电源工程师来讲,我们很多时候都在看波形,看输入波形,MOS开关波形,电流波形,输出二极管波形,芯片波形,MOS管的GS波形,我们拿开关GS波形为例来下GS的波形。我们测试MOS管GS波形
    发表于 11-16 09:15

    平衡小车代码的实现

    前言今天代码,只有直立功能的代码。代码总体思路给定个目标值,单片机通过IIC和mpu6050通信,得知数据后,根据角度环计算出个P
    发表于 01-14 08:29

    分析下C语言strlen需要注意的几点

    1、和bug菌同龄的小伙伴在听这首歌的时候,脑海中应该很有画面感吧,转眼间这首歌曲已经有20年了!今天主要是跟大家分析下C语言strlen需
    发表于 02-16 06:14

    用OpenHarmony设置zh_CN国际化以后总是报错的原因是什么

    用OpenHarmony [Standard]Empty Ability模板new个新项目设置zh_CN国际化以后直提示或在zh_element 的字符串。总是在哪里提示以下错误,或者在下
    发表于 04-19 11:09

    串口环形队列常用的几种方法

    1、串口常用的几种方式查询方式可靠性很高,要考虑下个数据包覆盖上个数据包的问题,小数据量,在10个字节以内,可以这样考虑, 很简单,很方便,很可靠。但是在数据量大的时候,
    发表于 07-21 15:17

    浅议基于JSF的Java国际化编程及其实现

    本文从实际操作的角度,讨论了利用JSF 开发Web 应用程序时实现程序国际化和本地化的方法。提出了解决应用程序国际化的MVC-R 四层框架
    发表于 01-27 13:47 9次下载

    程序时间控制电路图

    程序时间控制电路图
    的头像 发表于 05-08 15:18 1673次阅读
    <b class='flag-5'>程序时间</b>控制电路图