うるう秒に関する覚え書き

なんか今更うるう秒で騒いでる感じなので、一応メモ書きしておく。

## 恒星時系と原子時系とうるう秒

地球（！）では時刻を測る物差しについていくつかの「時刻系」が存在する。そのうち私たちの日常生活に大きく関わっているのが「恒星時系」と「原子時系」である。「世界時（Universal Time; UT）」は恒星時系の一種で、「協定世界時（Coordinated Universal Time; UTC）」は原子時系の一種である。どちらが正しいというわけではなく、物差しが異なるというだけの話である。

簡単に言うと、世界時は地球の自転を基準に「1日」を決め、そこから1秒の長さを決める仕組みである。ただし、地球の自転は大雑把に言って（潮汐摩擦などにより）遅くなる傾向にあるため（実はこれ20世紀に入ってからの知見）、世界時の1秒の長さが間延びしている。

一方の原子時系は1967年10月にパリで開催された世界度量衡総会で決められたもので、そこから「国際原子時（International Atomic Time; TAI）」が定義された。1958年初を基点に UT（厳密にはUT2）と TAI の時刻と時間を一致させて運用が始まったが、 UT と TAI の間で時間のギャップが大きくなってくる。

そこで UT と TAI のギャップを埋める UTC の議論が始まった。様々な試行錯誤の末、UTC の「時間」は TAI と同じにし、 UT（厳密には UT1）と UTC との時刻差が0.9秒を超えないよう適宜「うるう秒（Leap Second）」を設定することが決まった。これにより UTC と TAI との時刻差は常に整数の秒数になる。

うるう秒は1月1日または7月1日になる直前（UTC ですよ）に挿入または削除され、半年前には[告知](http://jjy.nict.go.jp/QandA/data/leapsec.html)がある。これまでのうるう秒の結果は以下の通り。

| 実施年月日     | 調整時間（秒） |  TAI - UTC（秒） |
|:---------------|---------------:|------------------:|
| 1972年1月1日   |             ― |                10 |
| 1972年7月1日   |             +1 |                11 |
| 1973年1月1日   |             +1 |                12 |
| 1974年1月1日   |             +1 |                13 |
| 1975年1月1日   |             +1 |                14 |
| 1976年1月1日   |             +1 |                15 |
| 1977年1月1日   |             +1 |                16 |
| 1978年1月1日   |             +1 |                17 |
| 1979年1月1日   |             +1 |                18 |
| 1980年1月1日   |             +1 |                19 |
| 1981年7月1日   |             +1 |                20 |
| 1982年7月1日   |             +1 |                21 |
| 1983年7月1日   |             +1 |                22 |
| 1985年7月1日   |             +1 |                23 |
| 1988年1月1日   |             +1 |                24 |
| 1990年1月1日   |             +1 |                25 |
| 1991年1月1日   |             +1 |                26 |
| 1992年7月1日   |             +1 |                27 |
| 1993年7月1日   |             +1 |                28 |
| 1994年7月1日   |             +1 |                29 |
| 1996年1月1日   |             +1 |                20 |
| 1997年7月1日   |             +1 |                31 |
| 1999年1月1日   |             +1 |                32 |
| 2006年1月1日   |             +1 |                33 |
| 2009年1月1日   |             +1 |                34 |
| 2012年7月1日   |             +1 |                35 |
| 2015年7月1日   |             +1 |                36 |

## うるう秒の問題

うるう秒が発生する際にコンピュータ・ネットワークで起こりうる問題は大きく2つある。ひとつは時刻経過により生じ得る問題。もうひとつはタイムスタンプの問題である。

### NTP の Leap Indicator

NTP（Network Time Protocol）ではうるう秒が発生するタイミングで Leap Indicator（LI）を送る。 ntpd が STEP モードで動作している場合は、うるう秒の影響を即時に反映させようとして

```
23:59:59.000000（→ 23:59:59.999999）→ 23:59:59.000000 → 00:00:00.000000
```

という感じで1秒巻き戻す。これにより一瞬時刻が逆行することになる。2012年に起きたうるう秒に関する障害の原因の多くはこれ。

ntpd を SLEW モードで動作している場合は時刻を巻き戻さず、少しずつ時刻を調節する（このため時刻合わせに時間がかかる）。また SLEW モードでは Leap Indicator をセットしない。

したがって対策としては STEP モードで動作させないようにオプション等を調整するよとい（その代わり時刻の大きな進み遅れがないようにする必要があるが）。

### タイムスタンプの問題

電子署名などで使うタイムスタンプは厳密に UTC に準拠して運営されている。そのため、うるう秒の瞬間に「2015年6月30日 23:59:60 UTC」といったタイムスタンプがセットされる可能性がある。

このタイムスタンプを処理する際に、処理系によっては誤動作を起こす可能性がある。

- [【殴り書き】javascriptにおけるうるう秒の調査 - Qiita](http://qiita.com/J_3woo86/items/8641b98c14278569ab94)
- [【殴り書き】C#におけるうるう秒調査 - Qiita](http://qiita.com/J_3woo86/items/31ffd000786273fd05e6)

タイムスタンプ・サービスを行っているプロバイダでは、うるう秒の前後でサービスを止めて「23:59:60 UTC」のタイムスタンプが発生しないようにしているところもある。

## うるう秒廃止論

うるう秒を巡っては昔から議論がある。これについて以下の記事の後半部分が参考になるので紹介しておく。

- [「うるう秒」18年ぶりの平日実施──7月1日午前に「8時59分60秒」挿入 -INTERNET Watch](http://internet.watch.impress.co.jp/docs/news/20150515_702167.html)

> 2015年3～4月の会合の段階では、4つの案が検討されているという。A案は「UTCへのうるう秒調整を廃止し、新たな連続時系を導入する」、B案が「現行UTCの定義を維持しつつ、新たに（うるう秒調整を廃止した）連続時系を導入し、2つの時系列を共存させる」、C案が「現行UTCの定義を変更しない」、D案は「研究の結論が出ていないため、現行UTCの定義を変更しない」となっている。

コンピュータ制御用に連続した時刻系を作るというのは悪くないが、私たちの日常生活の基準はあくまでも（進み遅れのある）恒星時系（世界時）である。そのギャップをどうするかという問題を解決しない限りうまくいかない気がする。

（これに関連する話で、多くの処理系の「時刻」変数は、内部表現では、ある時点からの経過時間（秒）になっている。しかし、これらがちゃんと「うるう秒」を考慮しているかはかなり怪しい。つまりコンピュータの時計は、一見 UTC であるかのように見せかけて、実は UT だったりするんだよね。その辺調べたほうがいいかな）

## ブックマーク

- [閏秒(うるう秒)とは何か](http://eco.mtk.nao.ac.jp/koyomi/topics/html/topics2013_1.html)
- [日本標準時プロジェクト　Information of Leap second](http://jjy.nict.go.jp/QandA/data/leapsec.html)
	- [プレスリリース | 「うるう秒」挿入のお知らせ | NICT-情報通信研究機構](http://www.nict.go.jp/press/2015/01/16-1.html)
- [7/1の閏秒を迎えるにあたってLinuxでは何をすべきか？ | Act as Professional](http://hiroki.jp/leap-second-2015)
- [サマータイム、うるう秒とタイムスタンプの関係｜タイムスタンプ入門｜セイコーサイバータイム](https://www.seiko-cybertime.jp/time/column3.html)
- [vSphereへのうるう秒調整の影響 - Qiita](http://qiita.com/tsukamoto/items/5bbecd29ac40ac16e039)
- [2015年7月1日の「うるう秒」挿入 (+1秒) にともなうトレンドマイクロ製品への影響について](https://app.trendmicro.co.jp/support/news.asp?id=2330)
- [2015年7月1日の「うるう秒」挿入に際する注意喚起 | さくらインターネット](http://www.sakura.ad.jp/news/sakurainfo/newsentry.php?id=1059)
- [Oracle 製品 (DB、WLS、BI) のうるう秒に対する対応について | NTTデータ先端技術株式会社](http://www.intellilink.co.jp/article/column/ora-report20150520.html)
- [うるう秒に関するサポートについて](https://support.microsoft.com/en-us/kb/2722715/ja) : Microsoft 製品
- [Linux - 間もなく来るうるう秒を控えてやっておくべき事 - Qiita](http://qiita.com/kirksencho/items/a4f8aa64e1ec2aca2af7)
- [Linux - ntpdのうるう秒対応(2015/07/01) - Qiita](http://qiita.com/shiru/items/fbb7c578abaac50762b2)