将GPS周数和周内时间转换为日期时间

7
我有一个GPS设备,它会将一些对象和GPS时间发送到我的服务器。
它的格式是周数和一周内的秒数。
我想将其转换为日期时间格式。我找到了一些代码,但是所有的代码都只能将周数转换为日期,没有包括一周内的秒数。
我在这个网页上找到了可以实现此功能的代码,但我不知道如何在C# Windows应用程序中使用它。
样例数据:
GPS Week number 1643
GPS second into week 377505

那应该是 2011/07/07 10:51:44

1
所引用的转换器似乎有问题。例如,0,600,61都会得到1980/01/06 00:01:00,但是GPS纪元后第一个闰秒直到1981/07/01才出现。 - jjlin
转换器实际上只是在GPS时间和TOW/WeekNo之间进行转换。它并不关心闰秒。列标题是错误的。 - TJJ
2个回答

10
如果您已经知道代表该周的 DateTime,只需调用 AddSeconds 方法即可找到所需的 DateTime。
根据您提供的计算器,第1643周、377505秒应该对应于2011年7月7日07:51:44而不是10:51:44(也许这是一个时区偏移量?)。无论如何,以下代码片段将为您提供与链接中的计算器相同的结果(当选择 GMT 时间时)- 对于不同的时区,您需要应用自己的偏移量。
DateTime GetFromGps(int weeknumber, double seconds)
{
    DateTime datum = new DateTime(1980,1,6,0,0,0);
    DateTime week = datum.AddDays(weeknumber * 7);
    DateTime time = week.AddSeconds(seconds);
    return time;
}

是的,我在我的代码中找到了错误。它从1980年1月1日开始。 - Ramah
4
并非纠正,而是供日后参考的注释 - GPS卫星的时间信号不包含闰秒,这意味着从此计算出来的时间会比标准的UTC慢上几秒钟。现在这个数字是16秒,但到2015年6月将变成17秒。 - Phlucious
为什么时间从(1980, 1, 6)开始?@Phlucious:所以我只需将闰秒添加到结果中找到最终的UTC吗? - basilisk
@basilisk 我知道他们选择1980年1月6日而不是1980年1月1日,因为那天是星期天,GPS时间是按周#和从星期日早上午零点开始跟踪的。但是为什么是1980年呢?我猜这大约是在Navstar出现时,但我不确定。关于添加闰秒-是的,只要在2017年夏季之后,您将向GPST添加18秒以获取UTC。请参阅维基页面以获取闰秒表和添加日期。他们保持非常及时更新。 - Phlucious

1

这在VB6中有效。

Dim dtt As Date
dtt = "6 / 1 / 1980"
dtt = DateAdd("d", (1837 * 7), dtt)
dtt = DateAdd("s", 129414, dtt)

1837是GPS周数 129414是本周的秒数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接