@@ -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