Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
toddlerya opened this issue Nov 8, 2022 · 5 comments
Open
Assignees
Labels
good first issue Good for newcomers

Comments

@toddlerya
Copy link

toddlerya commented Nov 8, 2022

问题描述

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。

@toddlerya toddlerya changed the title 【建议】KEEP导出的GPX数据时区格式不规范 【建议】KEEP导出的GPX数据时区格式不规范修复方法 Nov 8, 2022
@yihong0618
Copy link
Owner

yihong0618 commented Nov 8, 2022

Hi~ 感谢

有兴趣在代码里帮忙修复下么?我来合

@yihong0618 yihong0618 added the good first issue Good for newcomers label Nov 8, 2022
@yihong0618
Copy link
Owner

这块有个有意思的可以分享下(在代码里你也能找到)
理论上有 gpx -> 坐标点 -> 就能利用坐标点发现时区,我在代码里是这么做的。

@toddlerya
Copy link
Author

Hi~ 感谢

有兴趣在代码里帮忙修复下么?我来合

感谢这个有趣的项目,有时间写下代码提交~

@yihong0618
Copy link
Owner

好滴,感谢。理论上生成 gpx 那块 trim 一下最后的时间就行。

@yihong0618
Copy link
Owner

@toddlerya 参考资料非常好,学到了谢谢
但是,一个问题是很多 gpx 都没那么标准,所以大部分 gpx 读取的库都是认得

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
good first issue Good for newcomers
Projects
None yet
Development

No branches or pull requests

2 participants