dropooiの日記

Linux/クラウド/スマホ/IoT関連の情報集め

Linux 2015/7/1 うるう秒調査

2015年7月1日の、うるう秒調査

# 2015/5/26追記
tzdata (2015d-1.el6)が更新されていました。
sudo yum update tzdata

TZ=/usr/share/zoneinfo/right/Asia/Tokyo date -d "2015-07-01 08:59:60"
2015年 7月 1日 水曜日 08:59:60 JST
OK

TZ=/usr/share/zoneinfo/right/Asia/Tokyo date "+%Y%m%d %H:%M:%S" -d "1970-01-01 GMT +1435708824 second"
20150701 08:59:59
TZ=/usr/share/zoneinfo/right/Asia/Tokyo date "+%Y%m%d %H:%M:%S" -d "1970-01-01 GMT +1435708825 second"
20150701 08:59:60
TZ=/usr/share/zoneinfo/right/Asia/Tokyo date "+%Y%m%d %H:%M:%S" -d "1970-01-01 GMT +1435708826 second"
20150701 09:00:00

20150701 08:59:60が挿入されていました。

linuxカーネルが2.6.32-358.el6.x86_64より古い場合はntpdをslewモードに変更しておいた方が良さそうです。
さらに、ntpがntp-4.2.6p5-3.el6より古いとslewモードが動かないバグがあるようなので、古ければ
yum update ntp
しておきます。

ntpをslewモードへ
/etc/sysconfig/ntpd
OPTIONS="-x -u ntp:ntp -p /var/run/ntpd.pid -g"
service ntpd restart

ntpを止めておくという方法でもいいようですが、男らしくslewモードを設定します。
(自己責任)

参考
うるう秒挿入に伴う NTPの動作モード(slewモード)の変更手順書(UNIVERGE PF6800 v3.0 以上 v5.1 未満)
ntp-4.2.6p5-3.el6 より前で ntpd -x が slew にならないバグがある - dechnostick's blog

# 2015/5/26追記ここまで



通常の日本のRedHat系サーバのTZ設定
#cat /etc/sysconfig/clock
ZONE="Asia/Tokyo”

#strings /etc/localtime
TZif2
TZif2
JST-9

通常のLinuxではタイムゾーンは /usr/share/zoneinfo/Asia/Tokyo
で設定してあります。

うるう秒入りのタイムゾーンの定義ファイルは /usr/share/zoneinfo/right以下に有り
東京の場合は /usr/share/zoneinfo/right/Asia/Tokyo

通常はJSTうるう秒を考慮しないタイムゾーンで設定してあります。

同時に実行すると通常のタイムゾーンうるう秒対応のタイムゾーンでは現時点で25秒ずれている事が分かります。
これまでに25秒うるう秒が挿入されているという事ですね。
#date && TZ=/usr/share/zoneinfo/right/Asia/Tokyo date
2015年 1月 31日 土曜日 22:19:12 JST
2015年 1月 31日 土曜日 22:18:47 JST

この確認時にタイムゾーンファイルが古い場合はtzdataの更新が必要です。
(ntpdを普通に起動してあれば当日に問題が出る事はない)
#yum check-update | grep tzdata
#yum update tzdata

2015/7/1のUnixtimestampを通常とうるう秒で比較
#date "+%s" -d "2015-07-01 GMT"
1435708800
#TZ=/usr/share/zoneinfo/right/Asia/Tokyo date "+%s" -d "2015-07-01 GMT"
1435708825
やはり25秒ずれてますね。

#date "+%Y%m%d %H:%M:%S" -d "1970-01-01 GMT +1435708799 second"
20150701 08:59:59
#date "+%Y%m%d %H:%M:%S" -d "1970-01-01 GMT +1435708800 second"
20150701 09:00:00

というように'2015-07-01 08:59:60'とはなりません。

うるう秒対応だと08:59:60となるはず。
#TZ=/usr/share/zoneinfo/right/Asia/Tokyo date "+%Y%m%d %H:%M:%S" -d "1970-01-01 GMT +1435708824 second"
20150701 08:59:59

#TZ=/usr/share/zoneinfo/right/Asia/Tokyo date "+%Y%m%d %H:%M:%S" -d "1970-01-01 GMT +1435708825 second"
20150701 09:00:00

あれ、60秒にならない。
2015/7/1のうるう秒データはまだ無い模様。
TZ=/usr/share/zoneinfo/right/Asia/Tokyo date -d "2012-07-01 08:59:60"
2012年 7月 1日 日曜日 08:59:60 JST
これはok
TZ=/usr/share/zoneinfo/right/Asia/Tokyo date -d "2015-07-01 08:59:60"
date: invalid date `2015-07-01 08:59:60'
だめ


前回の2012/7/1で確認すると
TZ=/usr/share/zoneinfo/right/Asia/Tokyo date "+%Y%m%d %H:%M:%S" -d "1970-01-01 GMT +1341100823 second"
20120701 08:59:59

TZ=/usr/share/zoneinfo/right/Asia/Tokyo date "+%Y%m%d %H:%M:%S" -d "1970-01-01 GMT +1341100824 second"
20120701 08:59:60

TZ=/usr/share/zoneinfo/right/Asia/Tokyo date "+%Y%m%d %H:%M:%S" -d "1970-01-01 GMT +1341100825 second"
20120701 09:00:00

ちゃんと08:59:60が挿入されています。


NTPの状態
#ntpq -c rv
leap=00である事からうるう秒調整は発生していません。

そのうちNTPによりうるう秒の補正が入り
当日は1435708800が2秒つづくといった自動対応になるかと思います。
08:59:59(→ 08:59:59)→ 09:00:00

PHP(確認環境はphp5.4と5.5)だと
php > echo strtotime('2015-07-01 08:59:60');
1435708800
php > echo strtotime('2015-07-01 09:00:00');
1435708800

試しに上記のように明示的に60秒を指定すると次の0秒と同じUnixtimestampを返すようです。
(うるう秒関係無しに)

php > echo date("Y-m-d H:i:s", 1435708799);
2015-07-01 08:59:59
php > echo date("Y-m-d H:i:s", 1435708800);
2015-07-01 09:00:00
逆でも同じ



MySQL
08:59:60という表記で記録されることは無いようです。
仮に明示的に2015-07-01 08:59:60を指定してしまうと0になってしまいますが、
プログラムで明示的に08:59:60と指定してtimestampを挿入する事はありません。

mysql> select from_unixtime(1435708800), unix_timestamp('2015-07-01 08:59:60');

from_unixtime(1435708800) unix_timestamp('2015-07-01 08:59:60')
2015-07-01 09:00:00 0.000000

タイムゾーンが/usr/share/zoneinfo/Asia/Tokyoでntpd動かしていれば
所謂LAMP構成では基本問題なさそう。



参考
http://www.techscore.com/blog/2015/01/09/leap-second/
http://pocketstudio.jp/log3/2012/06/23/leaptime_2012/