Index: [Article Count Order] [Thread]

Date:  Tue, 26 May 2009 21:01:04 +0900
From:  Akinori Hattori <hattya@>
Subject:  [gentoojp-users:02133] Re: うるう秒
Sender:  hattya@
To:  gentoojp-users@
Message-Id:  <e21946b20905260501p18dd1f9ck79635a470f7238c2@>
In-Reply-To:  <20090409053404.87B5.119F3ACB@>
References:  <20090409041517.9F74.119F3ACB@>	 <20090409053404.87B5.119F3ACB@>
X-Mail-Count: 02133

自分の環境でも再現したため、いろいろと試してみました。

Gentoo:
- sys-libs/glibc-2.8_p20080602-r1
- sys-libs/timezone-data-2009c

Debian lenny:
- libc6 2.7-18
- tzdata 2008h-2

2009年1月1日午前08:59:60を表示してみようとすると、どちらの環境でも

$ TZ=right/Asia/Tokyo date -d@
Thu Jan  1 09:00:23 JST 2009

となりますが、タイムゾーンをUTCに変えると

$ TZ=right/UTC date -d@
Wed Dec 31 23:59:60 UTC 2008

となります。

他にもいろいろなタイムゾーンで試してみましたが、ヨーロッパや北米のタイムゾーンで
は特に問題がないようです。tzdata2009g.tar.gzのタイムゾーンの定義を見てみると、
夏時間を定義しているRule行のうち、今年以降も有効なものがあるタイムゾーンでは問題
がないようでした。

そこで、asiaファイルに以下のような2008年以降に有効な夏時間を定義してみると

$ mkdit tzdata2009g
$ cd tzdata2009g
$ wget ftp://elsie.nci.nih.gov/pub/tzdata2009g.tar.gz
$ tar zxf tzdata2009g.tar.gz

--- asia.orig   2009-04-21 05:18:01.000000000 +0900
+++ asia        2009-05-26 19:54:21.000000000 +0900
@@ -986,6 +986,8 @@
 Rule   Japan   1948    1951    -       Sep     Sat>=8  2:00    0       S
 Rule   Japan   1949    only    -       Apr     Sun>=1  2:00    1:00    D
 Rule   Japan   1950    1951    -       May     Sun>=1  2:00    1:00    D
+Rule   Japan   2008    max     -       Apr     Sun>=1  2:00    0       S
+Rule   Japan   2008    max     -       Oct     Sun>=1  2:00    1:00    D
 # but the only locations using it (for birth certificates, presumably, since
 # their audience is astrologers) were US military bases.  For now, assume
 # that for most purposes daylight-saving time was observed; otherwise, what

$ /usr/sbin/zic -d posix -y yearistype.sh asia
$ /usr/sbin/zic -d right -L leapseconds -y yearistype.sh asia
$ TZ=$(pwd)/right/Asia/Tokyo date -d@
Thu Jan  1 09:59:60 JDT 2009
$ TZ=$(pwd)/posix/Asia/Tokyo date -d@
Thu Jan  1 10:00:23 JDT 2009

となり、うるう秒が正しく効いています。ちなみにこれはAustralia/Sydneyからのコピペ
で、タイムゾーンの表記が「JDT」となっているのは変更の2行目の最後の列で「D」と表
記しているからです。

このとき、1999年1月1日午前08:59:60を表示してみようとすると

$ TZ=$(pwd)/right/Asia/Tokyo date -d@
Fri Jan  1 08:59:60 JST 1999

となり、やはりうるう秒が効いています。

どうやら、gmtimeまたはlocaltimeに渡す日時以降の年に夏時間のルールが存在しないタ
イムゾーンではうるう秒が効かないみたいです。

これはglibcのバグだと思いソースを見てみると、gmtimeもlocaltimeも結局は
time/tzfile.cの__tzfile_computeが処理をしているので、そのファイルの変更履歴を
glibcのgitレポジトリ <http://sources.redhat.com/git/?p=glibc.git> の
time/tzfile.cの2.6.1のタグがついている変更から順々に見ていったところ、
おそらくはこの変更 <http://tinyurl.com/ram3x6> でこの問題が起こったのはないかと
思います。

まだ、glibcのbugzillaに報告していませんが、後でしようかと思っています。ただ、
glibcの開発者に関する記事をDebianがeglibcに移行するという記事関連で目にしてちょ
っとしり込みしています。誰かかわりにやっていただけたら良いのですが。

-- 
Akinori Hattori <hattya@>