簡體   English   中英

將十進制 GPS 時間轉換為 UTC

[英]Converting a decimal GPS time to UTC

有很多類似的問題,但我沒有找到一個特定於我收到的 GPS output 數據的問題。 我的 GPS 的數據是十進制形式:

GPS 周:2145GPS 時間: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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM