Repository metrics
- Stars
- (4,477 stars)
- PR merge metrics
- (Avg merge 29d 23h) (2 merged PRs in 30d)
Description
问题描述
KEEP导出的GPX数据时间为UTC时间,但是却多了毫秒小数点,导致GPX导入Starva时将时区识别错误,时间混乱。
数据样本
<trkpt lat="32.1877403071313" lon="118.70919897992724">
<time>2022-10-25T23:18:10.175000Z</time>
</trkpt>
修复方式
测试
将小数点后的数据去掉
echo -e "<time>2022-09-19T12:08:37.731000Z</time>" | sed -n 's/\.[[:digit:]]\{3\}0\{3\}Z/Z/ p'
批量修复脚本
#!/bin/bash
ls *.gpx | xargs sed -i 's/\.[[:digit:]]\{3\}0\{3\}Z/Z/g'
引申问题
同样存在时区问题的还有行者软件导出的GPX时间也是不规范的
行者软件导出的时间格式为UTC格式,但是其真实事件却是东八区时间,这就导致导入Strava时出现了时区错误的问题。需要对时间格式进行转换。
Strava认可的时区格式为+08:00
比如:
行者软件导出的GPX如下:
<time>2022-10-17T07:14:49Z</time>
这是UTC格式,但其时间却是东八区时间 正确的格式应该如下,声明时区
<time>2022-10-17T07:14:49+08:00</time>
行者GPX时区修复
#!/bin/bash
ls *.gpx | xargs sed -i 's/Z</+08:00</g'
参考资料
按照GPX规范,GPX中的时间值如果没有指定时区,则默认应该按照UTC世界标准时间理解:
如:下面GPX四个时间串,表示的是一样的时间:
2015-05-19T20:31:37 : 没有指定时区,按照UTC时间理解(默认)
2015-05-19T20:31:37Z : 指定为UTC时间理解
2015-05-20T04:31:37+0800 : 指定了时区,即:北京时间,按照北京时间理解
2015-05-20T04:31:37+08:00 :同上
按照上面的逻辑,GPX中的时间就是一个唯一确定的时间时间,而不依赖与当时所处的时区。
GPX文件的时间格式遵守ISO-8601标准:
小时、分和秒都用2位数表示,对UTC时间最后加一个大写字母Z,其他时区用实际时间加时差表示。如UTC时间下午2点30分5秒表示为14:30:05Z或143005Z,当时的北京时间表示为22:30:05+08:00或223005+0800,也可以简化成223005+08。