[英]Converting a decimal GPS time to UTC
有很多類似的問題,但我沒有找到一個特定於我收到的 GPS output 數據的問題。 我的 GPS 的數據是十進制形式:
GPS 周:2145和GPS 時間:330374.741371 (手冊說這是代表“以秒為單位的一周時間”的雙精度數)
我正在嘗試將這個時間轉換為人類可讀的 UTC 時間。 我使用的是舊的 C++14,而不是 20,所以我不能只使用我不認為的 to_utc() function。 我主要對小數感到困惑。 在這個網站上: https://www.labsat.co.uk/index.php/en/gps-time-calculator看起來數據是“secondsOfTheWeek.secondsOfTheDay。我不確定如何將其轉換為 UTC 時間...
我相信這個 output 數據是自 1980 年 1 月 6 日午夜 GPS 紀元時間以來的秒數。而且我知道它不計算閏秒,因此也必須考慮到這一點。 如果我有一些關於如何開始進入 UTC 時間的指導,我想我可以找出 rest,但我不確定從哪里開始......
最終,我想將時間轉換為字符串,以使用“date -s”16 AUG 2021 13:51:00 或類似的東西設置操作系統系統。但首先我只需要轉換這個 GPS 時間。
C++20 chrono bits 有一個免費的開源預覽版,可與 C++14 一起使用。
#include "date/tz.h"
#include <chrono>
date::utc_seconds
convert(int gps_week, double gps_time)
{
using namespace date;
using namespace std::chrono;
int upper = static_cast<int>(gps_time);
auto gps_t = gps_seconds{} + weeks(gps_week) + seconds{upper};
return clock_cast<utc_clock>(gps_t);
}
這第一個 forms 通過將適當的周數添加到 gps 紀元,然后添加秒數,得到一個gps_time
。
接下來,您使用clock_cast
將其轉換為utc_time
(其中確實包括閏秒)。
這可以像這樣使用:
#include <iostream>
int
main()
{
using namespace date;
using namespace std;
cout << convert(2145, 330374.741371) << '\n';
}
哪個輸出:
2021-02-17 19:45:56
clock_cast
將紀元從 1980-01-06 更改為 1970-01-01,並添加在 gps 紀元和 UTC 時間點之間發生的閏秒數。 如果 gps 輸入恰好對應於閏秒,則將在秒字段中正確打印“60”。 例如:
cout << convert(1851, 259216) << '\n'; // 2015-06-30 23:59:60
這篇Wikipedia 文章說,一周中的時間實際上以 1.5 秒為單位,值范圍從 0 到 403,199。
static_assert(403'200 * 1.5 == 7 * 24 * 60 * 60);
如果發現自己在處理這種形式的數據,這里有一個替代的convert
實現,它可以直接處理這個輸入數據:
using gps_tow = std::chrono::duration<int, std::ratio<3, 2>>;
auto
convert(date::weeks gps_week_num, gps_tow tow)
{
using namespace date;
return clock_cast<utc_clock>(gps_seconds{} + gps_week_num + tow);
}
第一步是定義 1.5 秒的持續時間單位。 這種類型在上面稱為gps_tow
。
convert
function 現在采用兩個嚴格類型化的參數: weeks
數和gps_tow
數。 然后只需將這些部分與 gps 時期一起添加,然后將clock_cast
加到utc_clock
中。
它可以像這樣使用:
cout << convert(weeks{1851}, gps_tow{172811}) << '\n';
此示例的 output 是:
2015-06-30 23:59:60.5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.