1. 程式人生 > >將GPS獲得的UTC時間轉換成本地時間的方法

將GPS獲得的UTC時間轉換成本地時間的方法

通過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個時區,為了讓全國人民採用北京時間,將中國版圖內的所有時區都劃為東八區,如下圖所示
china.jpg-1289.5kB

上圖中,紅色矩形內的所有地區都統一劃為東八區,也即是:

北緯17.9度~北緯53度,東經75度~東經125度 的區域
北緯40度~北緯53度,東經125度~東經135度 的區域

這樣劃分之後,除中國新疆烏魯克恰提,靠近塔吉克和阿富汗的部分地區和部分島嶼外,所有中國版圖內的地區都屬於東八區,使用的是北京時間。
但這樣劃分的後果是,印度,孟買,印尼,東南亞各國,部分俄羅斯地圖和部分朝鮮地區,都被使用的北京時間。

根據經度來計算時區的方法雖然正確,但全球很多國家由於採用統一的國家時間,他們所使用的時區並不是他們地理位置的真正時區,這個問題是無法解決的,只能說先滿足中國再說。