yihong0618/running_page

【建议】KEEP导出的GPX数据时区格式不规范修复方法

Open

#337 opened on Nov 8, 2022

View on GitHub
 (5 comments) (0 reactions) (1 assignee)Python (1,402 forks)github user discovery
good first issue

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。

Contributor guide