将GPS获得的UTC时间转换成本地时间的方法
来源:互联网 发布:手机淘宝购物教程 编辑:程序博客网 时间:2024/06/05 17:56
通过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;}
三、关于世界时区的划分与北京时间的统一
http://map.ps123.net/world/UploadFile/201501/2015012722245397.jpg
从上图可以看出,中国横跨东五区、东六区、东七区、东八区、东九区等五个地理时区。北京时间是中国采用北京所在的东八时区的区时作为标准时间。那么问题来了,由于中国统一采用的是北京时间,而程序中将UTC时间转换成本地时间时,计算时区是根据经度来计算的,这样就会将中国划分为5个时区,为了让全国人民采用北京时间,将中国版图内的所有时区都划为东八区,如下图所示
上图中,红色矩形内的所有地区都统一划为东八区,也即是:
北纬17.9度~北纬53度,东经75度~东经125度 的区域
北纬40度~北纬53度,东经125度~东经135度 的区域
这样划分之后,除中国新疆乌鲁克恰提,靠近塔吉克斯坦和阿富汗的部分地区和部分岛屿外,所有中国版图内的地区都属于东八区,使用的是北京时间。
但这样划分的后果是,印度,孟买,印尼,东南亚各国,部分俄罗斯地图和部分朝鲜地区,都被使用的北京时间。
根据经度来计算时区的方法虽然正确,但全球很多国家由于采用统一的国家时间,他们所使用的时区并不是他们地理位置的真正时区,这个问题是无法解决的,只能说先满足中国再说。
阅读全文
1 0
- 将GPS获得的UTC时间转换成本地时间的方法
- 将UTC(字符串包含TZ的时间)时间转换成本地时间 python
- oracle之 将UTC时间转换成本地时间
- java将UTC时间转换成本地时间
- Delphi中将GMT时间转换成本地时间的方法
- UTC时间string转换成本地时间string
- UTC时间的转换
- GPS时间和UTC时间的区别,
- GPS,UTC和本地时间的显示器
- Python的UTC时间转换
- ISODate 转换成本地的时间的函数
- python将时间修改成本地的TIME ZONE
- 用date命令把自epoch时间到现在的描述转换成本地时间
- 本地时间和GMT(UTC)时间的转换
- UTC时间与UNIX时间戳之间的转换
- 本地时间和GMT(UTC)时间的转换(C#)
- 本地时间和GMT(UTC)时间的转换
- 本地时间与UTC(世界协调时间)的转换
- 原生js和jquery对照
- FPGA基础设计(四):IIC协议
- C++ 多线程函数在main函数和类中的使用方式
- Android学习(五)使用Activity入门
- C++——Minimum——最短路、最小生成树
- 将GPS获得的UTC时间转换成本地时间的方法
- fiddler域名重定向
- Newtonsoft.Json之数据对象的属性验证
- memory block
- ArcGIS--数据互操作模块的安装和使用
- java.lang.NoSuchMethodError: org.springframework.beans.factory.support.RootBeanDefinition.<init>
- 根据坐标显示目标边框
- Centos7基础环境配置(为普通用户添加root权限/更换yum源/关闭防火墙/系统SELinux设置)
- 理解spring任务调度timer,Quartz,spring task