为什么导入的 GPX 文件时间显示不对?
一条记录得完全正常的轨迹,上传之后地图上的位置分毫不差,旁边显示的时间却早了六个小时,或者晚了六个小时,明明是中午走的路,看起来却成了凌晨。文件没有任何问题。GPX 本来就不存时区,交给哪个服务,就得靠那个服务自己去猜一个时区补上。
先说结论
GPX 里的每一个时间戳都是用 UTC(协调世界时)写的,完全不带时区信息。上传到某个地方之后,如果一条轨迹看起来是凌晨出发的,那个点本身其实没有记错。真正发生的,是 UTC 的数值被当成本地时间直接显示了,或者接收的服务用了一个跟你实际所在时区不一样的时区去换算。
这是显示层面的问题,不是数据层面的问题。经纬度、海拔和点的先后顺序都完全没变,变的只是每个点旁边打印出来的那个时刻。
GPX 为什么只存 UTC
GPX 文件里的每一个时间戳都是同一种写法——日期、时间,后面跟一个表示 UTC 的字母"Z"。格式里根本没有留一个字段给时区偏移或者地点,这不是疏漏,是故意这么设计的。一份在某个大洲记录、拿到另一个大洲打开的文件,指向的必须还是同一个瞬间,跟打开它的地方没有关系。要保证这一点,唯一的办法就是把所有时间戳都钉死在一个哪里都不会变的基准上。UTC 就是这个基准。代价是,把它换算回人能看懂的时间,完全要靠打开文件的那一方自己来做。
这个偏差到底从哪来
原因不止一个,好几种情况都会产生同一个症状:
- 接收服务里账号设置的时区。Strava、Garmin Connect 之类的服务,会把 UTC 换算成你账号设置的那个时区,不是你实际走那条路时所在的时区。手机账号还设成家乡时区,在国外记录的轨迹就会按家乡时间显示,不是当地时间。
- 完全没做时区处理的查看工具。有些比较简单的工具直接把 UTC 的数值当成本地时间打印出来,这种情况看起来偏差最夸张——差的是几个小时,不是几分钟。
- 夏令时切换前后。切换前后几天记录的轨迹,换算用的固定时区偏移量可能跟实际记录那一刻生效的偏移量不一致,看起来就会差一个小时。
- 记录那一刻手机自己的时钟。这种情况少见,但如果手机系统时间本身就不对,这个误差会直接写进每一个时间戳里,之后不管时区处理得多准确,都补不回来。
这不意味着什么
这不意味着文件坏了,也不是要重新记录或者重新导出的理由。距离、累计爬升、配速,还有地图上轨迹的形状,都是从坐标和时间戳之间的间隔算出来的,显示的时刻本身对不对,都不会影响这些数字。地图上的轨迹完美无缺,开始时间却离谱到不可能——这个组合恰恰就是这种情况最清楚的信号。
怎么把显示的时间改对
去检查那个显示错误时间的服务里的时区设置,通常是账号或者个人资料里的一项设置,跟文件本身没关系。这个设置改一次,之后再上传的每一份文件都会显示正确,不只是你现在发现问题的这一份。
直接改文件里的原始时间戳,技术上也做得到——它就是纯文本,用合适的工具可以给每一个点都加上同一个偏移量。但这几乎从来都不是该做的事,因为这些时间戳一开始就没有错。只有在你确实需要一份打印出来的时间已经对齐本地时间的文件、准备交给别处的特殊情况下,这样做才有意义。
TrailCam 能做什么
TrailCam 把轨迹导出成 GPX 1.1,Strava、Garmin Connect、Komoot 都读得懂这个规格,它的时间戳也遵循跟所有符合规范的 GPX 文件一样的 UTC 约定。如果导出之后在别处看到时间不对,该改的是那边服务的时区设置,不是导出本身。导出功能包含在可选的 TrailCam Pro 里,App 本身免费下载。
常见问题
- 导入的 GPX 文件时间不对,是不是说明文件坏了?
- 不是。坐标、海拔和点的顺序都不受影响。GPX 的时间戳用 UTC 写入,不存时区信息,显示出来的时间完全取决于打开它的那个 App 怎么把 UTC 数值换算成本地时间。
- GPX 文件能不能存一个时区,省得每次都要换算?
- 不能。这个格式只存 UTC 时间,根本没有留字段给时区偏移。换算成本地时间的工作,全部要靠打开文件的软件自己完成。
- 显示的时间不对,会影响距离或者海拔的数字吗?
- 不会。那些数字是从坐标和时间戳之间的间隔算出来的,不是从屏幕上显示的那个时刻算出来的。时钟显示不对,和轨迹本身准确,两者并不矛盾。
记录你自己的轨迹
TrailCam 是一款 iPhone 上的 GPS 轨迹记录 App,会把沿途拍的视频、照片和语音钉在你拍下它的那个位置,并支持导出成 GPX 1.1 或 CSV。免费下载。