去年互联网地图行业开始引入众包模式,国内比较大的地图商,比如四维图新、高德地图、百度地图纷纷开始推出UGC应用,众包给用户采集门址、公交站等信息,并按照工作量给与采集者一定的回报。我曾经玩过某德推出的“道路寻宝”APP,应用内部集成了道路拍拍、门址采集、公交拍拍、POI任务等。该应用有如下限制:(1)为了防止作弊,采集者必须打开GPS,才能拍摄门牌号。(2)为了保证图片清晰,采集工作只能在日出后半小时至日落前半小时内进行。问题在于,应用仅仅读取手机的时间进行日出日落时间判断。有一次晚上参加用户线上会议,一位远在新疆的采集者抱怨,往往烈日当头采集就被强制结束。PS:其实还有一个BUG他没有发现:太阳升起之前,采集就已经放开了;而且如果你是位于东北三省东部的用户,在日落后依然可以采集~

那么问题到底出在什么地方?先从时区谈起。

理论时区

众所周知,由于时差问题,世界各地的日出日时刻是不同的。然而,每个国家或地区,都喜欢把日出时刻定在5-7点左右,把日落时刻定在17-19点左右。这样一来,使用全球统一的格林威治标准时间,就只能停留在专业领域,而在民用领域,大家各自为政,使用适合自己的时间。这就产生了时区。以穿越英国伦敦格林威治的本初子午线为基准,向东向西分别设置了12个时区,每个时区的“时间”数值相差一个小时。

理论时区以被15整除的子午线为中心,向东西两侧延伸7.5度,即每15°划分一个时区,这是理论时区。理论时区的时间采用其中央经线(或标准经线)的地方时。所以每差一个时区,区时相差一个小时,相差多少个时区,就相差多少个小时。东边的时区时间比西边的时区时间来得早。格林威治的0度经线,向东西各延伸7.5度,构成的15度范围组成的时区就是UTC±0,0时区所采用的时间就是格林威治时间,该时间也被采用为国际标准时间度量。东经7.5-22.5度为东一区,以此类推,西半球也采取相同的类推方式。东十二区和西十二区是重合的(172.5E - 172.5W),国际日期变更线(180E/W)从中间穿越。从东向西穿越,日期加1天,西向东穿越,日期减1天。

法定时区

但是,国界线可不像经线、纬线那样平直。为了避开国界线,有的时区的形状并不规则,而且比较大的国家以国家内部行政分界线为时区界线,这是实际时区,即法定时区。于是,理论时区匀称、完美的划分,就变成了这样:(图片来自维基百科)

从图中可以看到,中国横跨了5个理论时区(从东五区 - 东九区),但是全部归在了法定时区UTC+8。美国的法定时区则尽量趋近于理论时区,因此就有了美东、美西、太平洋..等时间的区别。为了充分利用阳光,有的地区夏季会采用夏时制。我国曾采用了6年夏时制,但是由于我国将多个理论时区统一为东八区,因此新疆等天亮的较晚的地区并不能起到节约能源的作用,加上我国民众科学素养普遍不高,导致了更多的混乱,因此草草收场。

北京时间

某一国采用哪一个法定时区,一般取决于首都所在的理论时区。北京位于东八区,因此采用东八区中心经线(120E)所在位置的地方平太阳时(理论时间)作为法定时间,而不是北京的地方平太阳时(北京大致位于116E,40N附近)。上海位于120E,31N,几乎挨着东八时区的中央经线。

移动设备、计算机的时间是如何校准的?

众所周知,目前全球有为数众多的互联网授时服务,例如美国海军天文台授时中心,我国有中国科学院国家授时中心。这些授时服务提供的数据格式多种多样,比如从1970年1月1日到现在多少秒的整数。但这些授时中心采用的时间基准是GMT,即格林威治国际标准时间。我们电脑全新安装系统,或者手机、平板第一次启用,一般会有区域设置:“UTC+8,北京、香港、台北、新加坡”。设置完毕后,设备就可以换算出当地时间。

GPS时间

到这里相信很多人也都明白了。GPS模块(以Android手机为例,调用location.getTime())获取的时间,是基于理论时区进行计算的当地理论时间。GPS卫星会广播当前的世界标准时间,然后根据经纬度算出所在理论时区,即可在线性时间内算出理论时区的当地时间。比如你人在新疆喀什,位于理论东五区,此时北京时间是上午10点,那么你的手机时间也是10点,但是GPS获取的时间则是7点(东八区 - 东五区 = 3小时时差)。

仅通过经纬度能否获取当地法定时间?

理论上可行。但是实际上非常困难:由于国界线的不规则性,要存储地球上某一点(假设是10米 * 10米面积的粒度)所在的国家或法定时区,数据量是非常庞大的,实际意义并不大。因此当前的解决方案,都是要求用户自己手动设置区域选项(而且大多是在初始化向导中强制设置)。夏时制的映射规则则要简单多了,因此一般都会有设备自行判断。

“道路寻宝”BUG的解决方案

第一,将当前时间获取方式改为通过GPS获取,就可以进行真正的日出日落判断。如果以时区为粒度,一般在理论上取早晨6点日出,18点日落,并在夏至、冬至前后进行适当调整。

第二,有些Android手机厂商开发的driver实在是太烂了,通过getTime可能获取不到当地理论时间,那么只有通过GPS读取的经度进行代码switch-case条件判断了:

switch(longitude)

{

  case 67.5E-82.5E(理论东五区): 使用当地理论时间即“手机时间(北京时间)- 3小时”判断;

  case 82.5E-97.5E(理论东六区): 使用当地理论时间即“手机时间(北京时间)- 2小时”判断;

  .....;

  case 127.5E-142.5E(理论东九区): 使用当地理论时间即“手机时间(北京时间)+ 1小时”判断;// 黑龙江佳木斯市抚远县黑瞎子岛差不多就在134E,这里是中国最东端

}

更好的做法,就是在按照上述方式获得当地理论时间后,还要直接通过GPS经纬度,计算该点的日出日落时刻。因为该方式是精确到点的,因此计算的日出日落时刻和实际的日出日落时刻的误差只有几秒。而采用“6点日出18点日落”,误差有时会很大。这需要复杂的科学计算,用代码库可以实现。

更多

上述三条解决方案,保证了当地理论时间如何正确获取。还有一个问题,就是如何计算日出日落时刻,而简单采用“6点日出18点日落”也仅适用于春分、秋分前后,在冬至、夏至需要进行适当调整和近态拟合,否则计算日出日落时刻和实际日出日落时刻的误差会达到一个小时以上。

实际上,影响一个地方日出日落时刻的因素有很多,日期,纬度,海拔高度都需要考虑。要理解这些,需要专业的地理知识和科学计算,写起来又是长篇大论,所以此处略去一万字。大致规律是:越靠近赤道,日出/日落时刻越趋近于6点/18点;在任何地点,越接近一年当中的春分、秋分,日出/日落时刻同样越趋近于6点/18点;在北半球的夏季,越靠北,日出越早日落越晚,直到出现极昼现象。如果你的业务开展到俄罗斯北部,北极圈以内,那么请忘记日出日落吧~北半球冬季则正相反。南半球在季节上也与北半球相反。

地图应用背后的原理远不止这些。天朝特有的坐标扭曲和偏移也是一大问题,同国际标准的WGS84坐标系相比,国内地图商要交费使用保密的转换插件。

转载于:https://www.cnblogs.com/radiolover/p/4339668.html

时区之痒 - 从手机GPS模块获取的时间,真的是北京时间么?相关推荐

  1. shineblink NEO-6M GPS模块获取经纬度/海拔/时间详解

    NEO-6M GPS模块获取经纬度/海拔/时间 一.本例程实现功能 二. GPS使用说明 三.接线图 五.完整代码 六.代码运行结果 七.坐标系转换(需注意): 一.本例程实现功能 通过NEO-6M ...

  2. 将UTC、EST时区的时间转化成北京时间(python)

    1.将得到的UTC时间转化成北京时间:(假设获得的时间格式为:2018-08-02T14:17:39+00:00) def utc_to_local(utc_time_str, utc_format= ...

  3. kindlefire刷安卓系统_测试kindle fire 刷安卓4系统用手机GPS模块导航

    此文涉及软件已提供下载,均在软件和镜像下载中的phone目录中,其中高德导航是学习版本(这个大家都懂吧)用户名和密码获取 设备到手,kindle fire 一台,Moto XT 316一台,XT316 ...

  4. Android开发,GPS获取实时时间并转为北京时间,定位信息,海拔高度,并进行显示

    在转载的基础上增加一些内容,主要是时间的转换所以这里直接先把重点列出来: (GPS时间转为本地时间): @SuppressLint("SimpleDateFormat")priva ...

  5. 手机GPS 搜星 根据信燥比 判断 信号强弱

    好久没写博客了,最近都在忙其他事. 最近遇到一个问题就是 做了一个基于手机GPS模块的APP,客户要求根据GPS获得的坐标与指定点的坐标计算距离,小于规定的并滞留5分钟时,自动结束或者提示. 效果什么 ...

  6. python gps模块_一步一步使用uPyCraft学习MicroPython之GPS记录器

    本帖最后由 沧海笑 于 2017-7-2 16:06 编辑 [本期故事]本期制作一个gps轨迹记录仪,使用的uPyCraft IDE以及micropython.为了叠装在萤火虫esp32上,我们还专门 ...

  7. 测绘人须知,激光雷达中UTC时间、GPS时间和北京时间三者之间的关系

    测绘人对于"时间"有着天然的敏感,尤其在接触激光雷达系统之后,发现有好多"时间"呐.UTC时间.GPS时间和北京时间,以后还有很多机会接触北斗时间.相信各位不会 ...

  8. python3 时区 时间戳 指定输入时间为东八区时间、北京时间

    前言 一般的时间字符串是这样的:2021-07-24 21:23:51 *其实少了时区信息,只是默认为东八区 所以也有这样写的:2021-07-24T21:23:51+08:00 *那个+08:00就 ...

  9. linux 设置时间为昨天,Linux —— 时间(tzselect、timedatactl命令,查看和修改时区,修改时区为东八区)...

    一.设置linux修改时区 首先查看当前时区 #date -R 显示结果为: [root@localhost 20190528]# date -R Wed, 29 May 2019 19:56:23 ...

最新文章

  1. linux文件夹多个空格,linux-在“ for”循环中读取带有空格,带有多个输入文件的制表符的完整行...
  2. 极光推送服务端API(定时推送任务,推送到指定设备,推送到所有设备)
  3. MyLinkedList
  4. c语言乘法表只有结果,要求输出结果显示相乘的两数及乘积怎么做?
  5. python移动端web开发代码_移动web前端开发,前端开发工作总结,移动端页面开发-我主页-一个前端程序猿的博客...
  6. 触摸事件touchevent
  7. 计算机相关专业试题,计算机基础类 模拟试题 计算机相关专业 模拟题 10套 附答案.doc...
  8. android thread 用法,我们如何在Android中使用runOnUiThread?
  9. css光盘转动,CSS 实现加载动画之五-光盘旋转
  10. 基于Modbus TCP-IP协议的WEINVIEW HMI与PC通讯
  11. (7)机器学习之make_bolbs
  12. Oracle如何实现跨库查询
  13. [ACM] hdu 2177 取(2堆)石子游戏(威佐夫博弈)
  14. 25匹赛马得前三名问题求解
  15. w ndows7旗舰版怎么重装系统,windows7旗舰版iso怎么安装
  16. 跟我读论文系列之XGBoost
  17. 邮件系统排名中企业邮箱有何优势,163邮箱能发国外邮件吗?
  18. 区块链推动食品安全走向新时代
  19. PostgreSQL-Arcgis地理数据库中的系统表
  20. 用C#举例单例模式应用场景有哪些

热门文章

  1. delphi接口带上请求头是什么意思_Python接口自动化之Token详解及应用
  2. python读取文档中有很多指标的数据 写成矩阵_图像处理与特征提取 —— 从 MATLAB 到 Python(一)图像、矩阵与数据的读写...
  3. python输入list_python学习(list增删改查、及常用方法)
  4. tinymce移动端使用_关于在移动端避免使用100vh的原因及解决方案
  5. 新浪sae部署html,利用新浪sae搭建discuz x2论坛
  6. 使用python构建向量空间_使用Docker构建Python数据科学容器
  7. ideahtml里面没有提示_抖音上爆火的苹果充电提示音,安卓手机也可以设置了!!...
  8. mro列表_MRO模块操作指导书
  9. Linux 切mms数据流,libmms MMSH Server响应解析缓冲区溢出漏洞
  10. helm安装_安装 helm 包管理工具