0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

聊一聊寫(xiě)國(guó)際化程序時(shí)要注意的時(shí)間問(wèn)題

大魚(yú)機(jī)器人 ? 來(lái)源:嵌入式大雜燴 ? 作者:雜燴君 ? 2022-11-14 15:48 ? 次閱讀

寫(xiě)國(guó)際化的程序比較難處理的兩個(gè)問(wèn)題可能是:時(shí)間問(wèn)題 、 編碼問(wèn)題

本篇文章來(lái)聊一聊時(shí)間問(wèn)題。

最近設(shè)備到了國(guó)外,時(shí)間不不準(zhǔn)了~

雜燴君一直在東八區(qū)寫(xiě)代碼,處理時(shí)間問(wèn)題時(shí),習(xí)慣性的把時(shí)區(qū)寫(xiě)死為東八區(qū),即設(shè)備的小時(shí)數(shù)總是基于GMT的小時(shí)數(shù)加上8個(gè)小時(shí)作為設(shè)備的小時(shí)數(shù)。

如果設(shè)備到了國(guó)外,設(shè)備的時(shí)間就不準(zhǔn)了,設(shè)備的小時(shí)數(shù)對(duì)不上當(dāng)?shù)氐男r(shí)數(shù)。我們的設(shè)備時(shí)間,是使用設(shè)備上GPS的授時(shí)時(shí)間給設(shè)備進(jìn)行時(shí)間校準(zhǔn)的。

設(shè)備從GPS拿到的時(shí)間數(shù)據(jù)只是UTC時(shí)間。所以,不同地區(qū)的時(shí)間,需要基于UTC時(shí)間+/-時(shí)區(qū),向西減小,向東增加。當(dāng)?shù)氐臅r(shí)區(qū),可以根據(jù)當(dāng)?shù)氐慕?jīng)度進(jìn)行計(jì)算,這個(gè)后面再說(shuō)。

下面我們先來(lái)了解一些概念:

GMT與UTC時(shí)間

GMT時(shí)間(Greenwich Mean Time,格林威治時(shí)間),之前作為全球時(shí)間的基準(zhǔn)參考時(shí)間。

UTC時(shí)間(Universal Time Coordinated, 世界標(biāo)準(zhǔn)時(shí)間或世界協(xié)調(diào)時(shí)間),以原子時(shí)秒長(zhǎng)為基礎(chǔ),在時(shí)刻上盡量接近于世界時(shí)的一種時(shí)間計(jì)量系統(tǒng)。UTC是基于標(biāo)準(zhǔn)的GMT提供的準(zhǔn)確時(shí)間。

UTC時(shí)間和GMT時(shí)間其實(shí)是同一個(gè)時(shí)間,只不過(guò)UTC時(shí)間用秒來(lái)表示。

1、獲取UTC時(shí)間

獲取UTC時(shí)間的接口

#include
time_ttime(time_t*tloc);

該接口返回1970-01-01 0000 +0000至今的秒數(shù)(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;
}

運(yùn)行結(jié)果:

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

2、獲取GMT時(shí)間

獲取GMT時(shí)間的接口:

#include
structtm*gmtime(consttime_t*timep);

該接口返回tm結(jié)構(gòu)的GMT時(shí)間(UTC時(shí)間)。

tm結(jié)構(gòu):

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;
}

運(yùn)行結(jié)果:

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

時(shí)區(qū)

由于世界各國(guó)家與地區(qū)經(jīng)度不同,地方時(shí)區(qū)也有所不同,因此會(huì)劃分為不同的時(shí)區(qū)。

正式的時(shí)區(qū)劃分包括24個(gè)時(shí)區(qū),每一時(shí)區(qū)由一個(gè)英文字母表示。每隔經(jīng)度15°劃分一個(gè)時(shí)區(qū),有一個(gè)例外,每個(gè)時(shí)區(qū)有一條中央子午線。

1、時(shí)區(qū)劃分方法:

現(xiàn)今全球共分為24個(gè)時(shí)區(qū)。英國(guó)(格林尼治天文臺(tái)舊址)為中時(shí)區(qū)(零時(shí)區(qū))、東1—12區(qū),西1—12區(qū)。每個(gè)時(shí)區(qū)橫跨經(jīng)度15度,時(shí)間正好是1小時(shí)。

最后的東、西第12區(qū)各跨經(jīng)度7.5度,以東、西經(jīng)180度為界。每個(gè)時(shí)區(qū)的中央經(jīng)線上的時(shí)間就是這個(gè)時(shí)區(qū)內(nèi)統(tǒng)一采用的時(shí)間,稱為區(qū)時(shí),相鄰兩個(gè)時(shí)區(qū)的時(shí)間相差1小時(shí)。

2、經(jīng)度范圍:

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

3、當(dāng)?shù)貢r(shí)區(qū)計(jì)算

需要用到的接口:

#include
structtm*localtime(consttime_t*timep);

計(jì)算當(dāng)?shù)貢r(shí)區(qū):

#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_zone12)
{
local_time_zone-=24;
}else{}

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

return0;
}

我們當(dāng)前為北京時(shí)間:

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

我們把Ubuntu時(shí)間日期里的地點(diǎn)改到其它國(guó)家:

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

CST 時(shí)間

CST (China Standard Time,中國(guó)標(biāo)準(zhǔn)時(shí)間)。

中國(guó)標(biāo)準(zhǔn)時(shí)間一般指北京時(shí)間。北京時(shí)間是中國(guó)采用國(guó)際時(shí)區(qū)東八時(shí)區(qū)的區(qū)時(shí)作為標(biāo)準(zhǔn)時(shí)間。而中國(guó)幅員遼闊,東西相跨5個(gè)時(shí)區(qū)(即東五區(qū)、東六區(qū)、東七區(qū)、東八區(qū)、東九區(qū)5個(gè)時(shí)區(qū))

“北京時(shí)間”適用于中國(guó)(大陸、港澳、臺(tái)灣)境內(nèi),但在大陸的新疆、西藏等地,政府機(jī)關(guān)、企事業(yè)單位作息時(shí)間和郵政通訊費(fèi)用優(yōu)惠分界點(diǎn)雖然用北京時(shí)間來(lái)表示,但也比其他各省延晚2小時(shí),使用UTC+6的情況更為普遍。

根據(jù)經(jīng)度計(jì)算時(shí)區(qū)

時(shí)區(qū)范圍是中央經(jīng)線的度數(shù)向左右分別減、加7.5度。用該地的經(jīng)度除以15度,當(dāng)余數(shù)小于7.5度時(shí),商數(shù)即為該地所在的時(shí)區(qū)數(shù),當(dāng)余數(shù)大于7.5度時(shí),商數(shù)加1即為該地所在的時(shí)區(qū)數(shù)。

#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;
}

這其實(shí)也是百度百科上提供的思路:

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

這種方式至少可以計(jì)算得到時(shí)區(qū)中心線的時(shí)區(qū)數(shù),但是一些臨界情況可能會(huì)差1小時(shí)。在網(wǎng)絡(luò)上也沒(méi)有找到其它更好的解決方案。

設(shè)備的時(shí)間,如果只是作為一個(gè)顯示功能,影響可能不是很大,但是如果設(shè)備的時(shí)間來(lái)做其它事情,比如定時(shí)功能,定時(shí)多少點(diǎn)多少分做什么事情,影響就很大了。

對(duì)于我們的設(shè)備,定時(shí)功能使用手機(jī)APP來(lái)操作的,這時(shí)候能想到的比較好的方法就是每當(dāng)使用手機(jī)APP的時(shí)候,把手機(jī)APP的時(shí)間給設(shè)備時(shí)間進(jìn)行一次校準(zhǔn)。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • gps
    gps
    +關(guān)注

    關(guān)注

    22

    文章

    2880

    瀏覽量

    165925
  • UTC
    UTC
    +關(guān)注

    關(guān)注

    1

    文章

    24

    瀏覽量

    14344
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    從焊接角度,設(shè)計(jì)PCB的5個(gè)建議

    完成個(gè)電路板,需要PCB工程師、焊接工藝、焊接工人等諸多環(huán)節(jié)的把控。今天通過(guò)定位孔、MARK點(diǎn)、留邊、焊盤(pán)過(guò)孔、輔助工具這五個(gè)方面從畫(huà)板的角度跟大家PCB設(shè)計(jì)。
    的頭像 發(fā)表于 02-06 10:31 ?1946次閱讀
    從焊接角度<b class='flag-5'>聊</b><b class='flag-5'>一</b><b class='flag-5'>聊</b>,設(shè)計(jì)PCB的5個(gè)建議

    消息隊(duì)列技術(shù)選型的7種消息場(chǎng)景

    我們?cè)谧鱿㈥?duì)列的技術(shù)選型時(shí),往往會(huì)結(jié)合業(yè)務(wù)場(chǎng)景進(jìn)行考慮。今天來(lái)消息隊(duì)列可能會(huì)用到的 7 種消息場(chǎng)景。
    的頭像 發(fā)表于 12-09 17:50 ?1300次閱讀
    <b class='flag-5'>聊</b><b class='flag-5'>一</b><b class='flag-5'>聊</b>消息隊(duì)列技術(shù)選型的7種消息場(chǎng)景

    Qt多國(guó)語(yǔ)言(國(guó)際化)問(wèn)題小結(jié)

    的需求,筆者就教學(xué)與項(xiàng)目開(kāi)發(fā)中的經(jīng)歷,小結(jié)了Qt多國(guó)語(yǔ)言(國(guó)際化)問(wèn)題,僅供參考。 假設(shè)我們已經(jīng)建好個(gè)工程,且可以運(yùn)行出基本的界面。1、打開(kāi)項(xiàng)目工程文件QTDemo.pro,添加如下語(yǔ)句
    發(fā)表于 05-18 10:35

    來(lái)Altium中Fill,Polygon Pour,Plane的區(qū)別和用法

    Fill會(huì)造成短路,為什么還用它呢?來(lái)Altium中Fill,Polygon Pour,Plane的區(qū)別和用法
    發(fā)表于 04-25 06:29

    stm32的低功耗調(diào)試

    前言:物聯(lián)網(wǎng)的大部分設(shè)備都是電池供電的,設(shè)備本身低功耗對(duì)延長(zhǎng)設(shè)備使用至關(guān)重要,今天就實(shí)際調(diào)試總結(jié)stm32的低功耗調(diào)試。1、stm32在運(yùn)行狀態(tài)下的功耗上圖截圖自stm32l15x手冊(cè)
    發(fā)表于 08-11 08:18

    平衡小車(chē)代碼的實(shí)現(xiàn)

    前言今天代碼,只有直立功能的代碼。代碼總體思路給定個(gè)目標(biāo)值,單片機(jī)通過(guò)IIC和mpu6050通信,得知數(shù)據(jù)后,根據(jù)角度環(huán)計(jì)算出個(gè)P
    發(fā)表于 01-14 08:29

    淺議基于JSF的Java國(guó)際化編程及其實(shí)現(xiàn)

    本文從實(shí)際操作的角度,討論了利用JSF 開(kāi)發(fā)Web 應(yīng)用程序時(shí)實(shí)現(xiàn)程序國(guó)際化和本地的方法。提出了解決應(yīng)用程序
    發(fā)表于 01-27 13:47 ?9次下載

    IIC總線設(shè)計(jì)

    大家好,又到了每日學(xué)習(xí)的時(shí)間了,今天咱們來(lái) IIC 總線設(shè)計(jì)。 、概述: IIC 是Inter-Integrated Circuit
    的頭像 發(fā)表于 06-22 10:32 ?9261次閱讀

    聽(tīng)北京鯨世科技的CEO,數(shù)據(jù)可視的發(fā)展

    可視的展示形式也改變著人類的對(duì)信息的閱讀和理解方式。今天ARinChina就請(qǐng)到了專注于數(shù)字可視技術(shù)的北京鯨世科技有限公司的CEO楊利堃,我們起來(lái)
    發(fā)表于 03-11 15:37 ?3449次閱讀

    7個(gè)維度和43條使用規(guī)范,Redis的最佳實(shí)踐

    這篇文章我想和你 Redis 的最佳實(shí)踐。 你的項(xiàng)目或許已經(jīng)使用 Redis 很長(zhǎng)時(shí)間了,但在使用過(guò)程中,你可能還會(huì)或多或少地遇到以下問(wèn)題: 我的 Redis 內(nèi)存為什么增長(zhǎng)這么
    的頭像 發(fā)表于 03-30 10:40 ?1675次閱讀
    7個(gè)維度和43條使用規(guī)范,<b class='flag-5'>聊</b><b class='flag-5'>一</b><b class='flag-5'>聊</b>Redis的最佳實(shí)踐

    FPGA中的彩色轉(zhuǎn)灰度的算法

    大家好,又到了每日學(xué)習(xí)的時(shí)間了,今天我們來(lái)FPGA學(xué)習(xí)中可以遇到的些算法,今天就
    的頭像 發(fā)表于 04-15 15:47 ?1919次閱讀

    【職場(chǎng)雜談】與嵌入式物聯(lián)網(wǎng)架構(gòu)師幾個(gè)話題

    【職場(chǎng)雜談】與嵌入式物聯(lián)網(wǎng)架構(gòu)師幾個(gè)話題
    的頭像 發(fā)表于 08-23 09:19 ?1286次閱讀
    【職場(chǎng)雜談】與嵌入式物聯(lián)網(wǎng)架構(gòu)師<b class='flag-5'>聊</b><b class='flag-5'>一</b><b class='flag-5'>聊</b>幾個(gè)話題

    簡(jiǎn)單DPT技術(shù)-double pattern technology

    今天想來(lái)簡(jiǎn)單DPT技術(shù)-double pattern technology,也就是雙層掩模版技術(shù),在目前先進(jìn)工藝下,這項(xiàng)技術(shù)已經(jīng)應(yīng)用的很普遍了。
    的頭像 發(fā)表于 12-05 14:26 ?1488次閱讀

    芯片設(shè)計(jì)的NDR是什么?

    今天突然想route相關(guān)的問(wèn)題,講講NDR是什么,我也梳理總結(jié)下我對(duì)NDR的認(rèn)識(shí)。
    的頭像 發(fā)表于 12-06 15:14 ?1689次閱讀

    鴻蒙實(shí)戰(zhàn)開(kāi)發(fā):【國(guó)際化部件】

    **國(guó)際化部件**為應(yīng)用提供了一系列國(guó)際化接口,包括:時(shí)間日期格式、數(shù)字格式、月份星期格式
    的頭像 發(fā)表于 03-21 22:07 ?283次閱讀
    鴻蒙實(shí)戰(zhàn)開(kāi)發(fā):【<b class='flag-5'>國(guó)際化</b>部件】