Skip to content

Commit 86f0c41

Browse files
committed
chrono/{tai,gps}_clock: クラス説明を増補
- 概要: TAI時計,GPS時計ではうるう秒補正が行われないことを明記 - うるう秒の扱い: "負のうるう秒"を考慮した表記に調整 - 例示: うるう秒の影響を追加 - gps_clockのうるう秒説明において"1970年"の意味を補足
1 parent 073c4bc commit 86f0c41

File tree

2 files changed

+74
-11
lines changed

2 files changed

+74
-11
lines changed

reference/chrono/gps_clock.md

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,23 @@ namespace std::chrono {
1313
## 概要
1414
`gps_clock`は、GPS時間 (GPST) を表現するためのクロックである。この時刻系は、カーナビや携帯端末などで使用される。
1515
16+
GPS時間ではうるう秒 (leap second) 補正が行われないため、2017年1月1日以降~2024年現在ではUTC (世界協定時) よりも18秒進んだ時間をとる。
17+
つまり 2024-01-01 00:00:18 GPS と 2024-01-01 00:00:00 UTC は等価である。
18+
1619
このクラスの[`now()`](gps_clock/now.md)静的メンバ関数は、標準では`noexcept(false)`である。実装が`noexcept(true)`である保証をしない限り、このクラスはTrivialClock要件を満たさない。
1720
1821
1922
### エポック
2023
クロックごとの初期時間 (内部的にカウンタがあれば値ゼロ) をエポックと呼ぶ。
2124
22-
`gps_clock`のエポックは、1980年1月6日 (この年の最初の日曜日) 0時0分0秒である。
25+
`gps_clock`のエポックは、1980年1月6日 (同年の最初の日曜日) 0時0分0秒である。
2326
2427
2528
### うるう秒の扱い
26-
このクロックではうるう秒は挿入されず、うるう秒の数だけ時間が進む。そのため、UTCにうるう秒が挿入されるたびに、UTCはGPSよりも1秒ずつずれていく
29+
`gps_clock`ではうるう秒は考慮されず、UTCに対してうるう秒分だけ時間がシフトする。そのため、UTCに正のうるう秒が挿入されるたびに、UTC時間はGPS時間よりも1秒ずつ遅れていく
2730
28-
GPS時間とTAI時間は19秒ずれていて、このずれは時間が経過しても変わらない。GPS時間のエポックが[`1958y`](year/op_y.md)`/`[`January`](month_constants.md)`/1`、TAI時間のエポックが[`1980y`](year/op_y.md)`/`[`January`](month_constants.md)`/`[`Sunday`](weekday_constants.md)`[1]`であるが、1958年から1970年までのオフセットが10秒と、1970年から1980年までに挿入されたうるう秒が9秒あるためだ。
31+
同じくうるう秒を考慮しない[TAI時間](tai_clock.md)に対してGPS時間は19秒遅れており、このずれは時間が経過しても変わらない。これはTAI時間のエポックが[`1958y`](year/op_y.md)`/`[`January`](month_constants.md)`/1`、GPS時間のエポックが[`1980y`](year/op_y.md)`/`[`January`](month_constants.md)`/`[`Sunday`](weekday_constants.md)`[1]`であるが、1958年から1970年までのオフセットが10秒と、1970年から1980年までに挿入されたうるう秒が9秒あるためだ。
32+
(1970年はTAI時間が定められた年である。)
2933
3034
3135
## メンバ関数
@@ -56,6 +60,7 @@ GPS時間とTAI時間は19秒ずれていて、このずれは時間が経過し
5660
5761
5862
## 例
63+
### 例1: 現在GPS時間
5964
```cpp example
6065
#include <iostream>
6166
#include <chrono>
@@ -68,20 +73,47 @@ int main()
6873
std::cout << tp << std::endl;
6974
}
7075
```
76+
* chrono::gps_clock[color ff0000]
7177
* now()[link gps_clock/now.md]
7278

73-
### 出力例
79+
#### 出力例
7480
```
7581
2019-10-24 11:15:37.493236171
7682
```
7783

84+
### 例2: うるう秒の影響
85+
```cpp example
86+
#include <iostream>
87+
#include <chrono>
88+
89+
namespace chrono = std::chrono;
90+
using namespace std::literals::chrono_literals;
91+
92+
int main() {
93+
auto utc_tp = chrono::utc_clock::from_sys(chrono::sys_days{2024y/1/1});
94+
auto gps_tp = chrono::gps_clock::from_utc(utc_tp);
95+
std::cout << utc_tp << " UTC" << std::endl;
96+
std::cout << gps_tp << " GPS" << std::endl;
97+
}
98+
```
99+
* chrono::gps_clock[color ff0000]
100+
* from_sys[link utc_clock/from_sys.md]
101+
* from_utc[link gps_clock/from_utc.md]
102+
103+
#### 出力
104+
```
105+
2024-01-01 00:00:00 UTC
106+
2024-01-01 00:00:18 GPS
107+
```
108+
109+
78110
## バージョン
79111
### 言語
80112
- C++20
81113
82114
### 処理系
83115
- [Clang](/implementation.md#clang): 9.0 [mark noimpl]
84-
- [GCC](/implementation.md#gcc): 9.2 [mark noimpl], 13.1 [mark verified]
116+
- [GCC](/implementation.md#gcc): 9.2 [mark noimpl], 13.2 [mark verified]
85117
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 3 [mark noimpl]
86118
87119

reference/chrono/tai_clock.md

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ namespace std::chrono {
1313
## 概要
1414
`tai_clock`は、TAI時間 (国際原子時、International Atomic Time) を表現するためのクロックである。
1515
16-
このクロックは、UTCよりも10秒進んでいる。そのため、1958-01-01 00:00:00 TAIと1957-12-31 23:59:50 UTCは等価である。
16+
TAIではうるう秒 (leap second) 補正が行われないため、2017年1月1日以降~2024年現在ではUTC (世界協定時) よりも37秒進んだ時間をとる。
17+
つまり 2024-01-01 00:00:37 TAI と 2024-01-01 00:00:00 UTC は等価である。
1718
1819
1920
このクラスの[`now()`](tai_clock/now.md)静的メンバ関数は、標準では`noexcept(false)`である。実装が`noexcept(true)`である保証をしない限り、このクラスはTrivialClock要件を満たさない。
@@ -23,12 +24,13 @@ namespace std::chrono {
2324
クロックごとの初期時間 (内部的にカウンタがあれば値ゼロ) をエポックと呼ぶ。
2425
2526
`tai_clock`のエポックは、1958年1月1日0時0分0秒である。
27+
これはUTC時間1957年12月31日23時59分50秒に対応する。
2628
2729
2830
### うるう秒の扱い
29-
このクロックではうるう秒は挿入されず、うるう秒の数だけ時間が進む。そのため、UTCにうるう秒が挿入されるたびに、UTCはTAIよりも1秒ずつずれていく
31+
`tai_clock`ではうるう秒は考慮されず、UTCに対してうるう秒数分だけ時間がシフトする。そのため、UTCに正のうるう秒が挿入されるたびに、UTC時間はTAI時間よりも1秒ずつ遅れていく
3032
31-
例として、2000年01月01日までに正のうるう秒が22回、負のうるう秒が0回挿入されたため、TAIがUTCより10秒進んでいることも含めて、2000-01-01 00:00:00 UTCと2000-01-01 00:00:32 TAIは等価となる。
33+
例として、`tai_clock`エポック日 (1958年1月1日) 時点ではUTCには正のうるう秒が10回挿入されており、さらに2000年01月01日までに正のうるう秒が22回、負のうるう秒が0回挿入されたため、2000-01-01 00:00:00 UTCと2000-01-01 00:00:32 TAIは等価となる。
3234
3335
3436
## メンバ関数
@@ -59,6 +61,7 @@ namespace std::chrono {
5961
6062
6163
## 例
64+
### 例1: 現在TAI時間
6265
```cpp example
6366
#include <iostream>
6467
#include <chrono>
@@ -71,23 +74,51 @@ int main()
7174
std::cout << tp << std::endl;
7275
}
7376
```
77+
* chrono::tai_clock[color ff0000]
7478
* now()[link tai_clock/now.md]
7579

76-
### 出力例
80+
#### 出力例
7781
```
78-
2019-10-24 11:15:47 TAI
82+
2019-10-24 11:15:47.519957239
7983
```
8084

85+
### 例2: うるう秒の影響
86+
```cpp example
87+
#include <iostream>
88+
#include <chrono>
89+
90+
namespace chrono = std::chrono;
91+
using namespace std::literals::chrono_literals;
92+
93+
int main() {
94+
auto utc_tp = chrono::utc_clock::from_sys(chrono::sys_days{2024y/1/1});
95+
auto tai_tp = chrono::tai_clock::from_utc(utc_tp);
96+
std::cout << utc_tp << " UTC" << std::endl;
97+
std::cout << tai_tp << " TAI" << std::endl;
98+
}
99+
```
100+
* chrono::tai_clock[color ff0000]
101+
* from_sys[link utc_clock/from_sys.md]
102+
* from_utc[link tai_clock/from_utc.md]
103+
104+
#### 出力
105+
```
106+
2024-01-01 00:00:00 UTC
107+
2024-01-01 00:00:37 TAI
108+
```
109+
110+
81111
## バージョン
82112
### 言語
83113
- C++20
84114
85115
### 処理系
86116
- [Clang](/implementation.md#clang): 9.0 [mark noimpl]
87-
- [GCC](/implementation.md#gcc): 9.2 [mark noimpl]
117+
- [GCC](/implementation.md#gcc): 9.2 [mark noimpl], 13.2 [mark verified]
88118
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 3 [mark noimpl]
89119
90120
91121
## 参照
92122
- [国際原子時 - Wikipedia](https://ja.wikipedia.org/wiki/国際原子時)
123+
- [国立天文台 水沢, うるう秒について](https://www.miz.nao.ac.jp/vlbi/leapsec.html)
93124
- [LWG Issue 3359. `<chrono>` leap second support should allow for negative leap seconds](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2117r0.html#3359)

0 commit comments

Comments
 (0)