namespace std::chrono {
class gps_clock;
}
概要
gps_clock
は、GPS時間 (GPST) を表現するためのクロックである。この時刻系は、カーナビや携帯端末などで使用される。
GPS時間ではうるう秒 (leap second) 補正が行われないため、2017年1月1日以降~2024年現在ではUTC (世界協定時) よりも18秒進んだ時間をとる。 つまり 2024-01-01 00:00:18 GPS と 2024-01-01 00:00:00 UTC は等価である。
このクラスのnow()
静的メンバ関数は、標準ではnoexcept(false)
である。実装がnoexcept(true)
である保証をしない限り、このクラスはTrivialClock要件を満たさない。
エポック
クロックごとの初期時間 (内部的にカウンタがあれば値ゼロ) をエポックと呼ぶ。
gps_clock
のエポックは、1980年1月6日 (同年の最初の日曜日) 0時0分0秒である。
うるう秒の扱い
gps_clock
ではうるう秒は考慮されず、UTCに対してうるう秒分だけ時間がシフトする。そのため、UTCに正のうるう秒が挿入されるたびに、UTC時間はGPS時間よりも1秒ずつ遅れていく。
同じくうるう秒を考慮しないTAI時間に対してGPS時間は19秒遅れており、このずれは時間が経過しても変わらない。これはTAI時間のエポックが1958y/January/1
、GPS時間のエポックが1980y/January/Sunday[1]
であるが、1958年から1970年までのオフセットが10秒と、1970年から1980年までに挿入されたうるう秒が9秒あるためだ。
(1970年はTAI時間が定められた年である。)
メンバ関数
静的メンバ関数
名前 | 説明 | 対応バージョン |
---|---|---|
now |
現在日時を取得する | C++20 |
to_utc |
GPS時間からUTC時間へ変換する | C++20 |
from_utc |
UTC時間からGPS時間へ変換する | C++20 |
メンバ型
名前 | 説明 | 対応バージョン |
---|---|---|
rep |
時間間隔の内部表現となる符号付き算術型。具体的な型は未規定 | C++20 |
period |
時間の周期を表すratio 型 ratio<unspecified, unspecified> |
C++20 |
duration |
時間間隔の型 duration<rep, period> |
C++20 |
time_point |
時間の一点を指す型 time_point<utc_clock> |
C++20 |
メンバ定数
名前 | 説明 | 対応バージョン |
---|---|---|
static constexpr bool is_steady |
逆行しないクロックかどうかを表すbool 値。値は未規定。 |
C++20 |
例
例1: 現在GPS時間
#include <iostream>
#include <chrono>
namespace chrono = std::chrono;
int main()
{
chrono::gps_clock::time_point tp = chrono::gps_clock::now();
std::cout << tp << std::endl;
}
出力例
2019-10-24 11:15:37.493236171
例2: うるう秒の影響
#include <iostream>
#include <chrono>
namespace chrono = std::chrono;
using namespace std::literals::chrono_literals;
int main() {
auto utc_tp = chrono::utc_clock::from_sys(chrono::sys_days{2024y/1/1});
auto gps_tp = chrono::gps_clock::from_utc(utc_tp);
std::cout << utc_tp << " UTC" << std::endl;
std::cout << gps_tp << " GPS" << std::endl;
}
出力
2024-01-01 00:00:00 UTC
2024-01-01 00:00:18 GPS
バージョン
言語
- C++20
処理系
- Clang: 9.0 ❌
- GCC: 9.2 ❌, 13.2 ✅
- Visual C++: 2019 Update 3 ❌