將GPS獲得的UTC時間轉換成本地時間的方法
阿新 • • 發佈:2019-02-12
通過GPS模組可以得到UTC時間,但如何將UTC時間轉換成你所在地的本地時間呢?下面介紹一種自己曾經使用過並得到過驗證的計算方法:
前提:已知UTC時間,經緯度
一、首先通過經緯度來計算出所在地時區
// 計算時區函式,根據經度來計算
static int calculateTimezone(double lat,double lon){
int a,b,c,timezone;
a = (int)(fabs(lon)+0.5);// 對經度進行四捨五入,且取正整數
b = a/15; // 商
c = a%15; // 餘數
if((lat >=17.9 && lat <=53 && lon>=75 && lon<=125) || (lat>=40 && lat <=53 && lon>=125 && lon<= 135)){// 如果經緯度處於中國版圖內,則都劃為東8區,為什麼要這樣劃分詳見第三節
timezone = 8;
}
else{
if(c > 7.5)
timezone = b+1;
else
timezone = b;
if (lon > 0.0f)
timezone = timezone;
else
timezone = (-1)*timezone;
}
return timezone;
}
二、將UTC時間轉換為本地時間
// UTC時間轉換為本地時間函式
static void UTCTOLocalTime(int timezone){
int year,month,day,hour;
int lastday = 0;// 月的最後一天的日期
int lastlastday = 0;// 上月的最後一天的日期
year = gpsData.UTCTime.year; //已知的UTC時間
month = gpsData.UTCTime.month;//已知的UTC時間
day = gpsData.UTCTime.day;//已知的UTC時間
hour = gpsData.UTCTime.hour + timezone; //已知的UTC時間
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))//判斷是否為閏年,年號能被400整除或年號能被4整除,而不能被100整除為閏年
lastlastday = 29;// 閏年的2月為29天,平年為28天
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))// 閏年的2月為29天,平年為28天
lastday = 29;
else
lastday = 28;
}
if(hour >= 24){// 當算出的區時大於或等於24:00時,應減去24:00,日期加一天
hour -= 24;
day += 1;
if(day > lastday){ // 當算出的日期大於該月最後一天時,應減去該月最後一天的日期,月份加上一個月
day -= lastday;
month += 1;
if(month > 12){// 當算出的月份大於12時,應減去12,年份加上一年
month -= 12;
year += 1;
}
}
}
if(hour < 0){// 當算出的區時為負數時,應加上24:00,日期減一天
hour += 24;
day -= 1;
if(day < 1){ // 當算出的日期為0時,日期變為上一月的最後一天,月份減去一個月
day = lastlastday;
month -= 1;
if(month < 1){ // 當算出的月份為0時,月份變為12月,年份減去一年
month = 12;
year -= 1;
}
}
}
//得到轉換後的本地時間
gpsData.localTime.year = year;
gpsData.localTime.month = month;
gpsData.localTime.day = day;
gpsData.localTime.hour = hour;
}
三、關於世界時區的劃分與北京時間的統一
從上圖可以看出,中國橫跨東五區、東六區、東七區、東八區、東九區等五個地理時區。北京時間是中國採用北京所在的東八時區的區時作為標準時間。那麼問題來了,由於中國統一採用的是北京時間,而程式中將UTC時間轉換成本地時間時,計算時區是根據經度來計算的,這樣就會將中國劃分為5個時區,為了讓全國人民採用北京時間,將中國版圖內的所有時區都劃為東八區,如下圖所示
上圖中,紅色矩形內的所有地區都統一劃為東八區,也即是:
北緯17.9度~北緯53度,東經75度~東經125度 的區域
北緯40度~北緯53度,東經125度~東經135度 的區域
這樣劃分之後,除中國新疆烏魯克恰提,靠近塔吉克和阿富汗的部分地區和部分島嶼外,所有中國版圖內的地區都屬於東八區,使用的是北京時間。
但這樣劃分的後果是,印度,孟買,印尼,東南亞各國,部分俄羅斯地圖和部分朝鮮地區,都被使用的北京時間。
根據經度來計算時區的方法雖然正確,但全球很多國家由於採用統一的國家時間,他們所使用的時區並不是他們地理位置的真正時區,這個問題是無法解決的,只能說先滿足中國再說。