Google Apps Scriptでn日後の日付の計算をするとき、ネットを探してみると以下のようなコードに出会いました。
// n日後の日付を取得
function dateAfterDayNum(dateBase, dayNum) {
var msecOfADay = 86400000;
var t1 = dateBase.getTime();
var msec = dayNum * msecOfADay;
var t2 = t1 + msec;
return new Date(t2);
}
1日が 86400秒
(=60秒60分24時間)と固定されていますが、うるう秒(閏秒)を含む日は1日 86401秒
です。最近では2016年年末にうるう秒の挿入があったので、その日は86401秒でした。
つまり、2016年12月31日の1日後の計算
dateAfterDayNum(new Date(Date.UTC(2016, 11, 31)), 1)
の結果が期待通り
2017年1月1日0時0分0秒
にならずに
2016年12月31日23時59分60秒
となる心配はないかと思ったのです。
Google Apps Scriptでテスト
いざGoogle Apps Scriptで試してみると、、、
2017年1月1日0時0分0秒
になりました。はい、取り越し苦労でした。
上のコードでも問題なくn日後の日付の計算ができるというわけです。
言い換えると、Google Apps Scriptでうるう秒の計算はできない、23時59分60秒は表現、計算できないということでしょう。
まあGoogle Apps Scriptを使うようなほとんどのケースで問題ないとおもいます。
n日後の日付の計算
なお、n日後の計算には
new Date(d.getFullYear(), d.getMonth(), d.getDate() + dayNum);
のコードを使いました。
JavaScriptでうるう秒
JavaScriptの仕様的にも、うるう秒は扱わないようです。
ECMAScript® Language Specification
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.1
In time values leap seconds are ignored. It is assumed that there are exactly 86,400,000 milliseconds per day.
Googleのうるう秒対応
Googleではうるう秒を ぼかして消す方法 で対応しています。
うるう秒がやって来る!〜 6 月 30 日の ” 1 秒”に備えよう〜
https://cloudplatform-jp.googleblog.com/2015/05/6-30-1.html
うるう秒前後の20時間の間、1秒をわずかに伸ばして (約1.000014秒
に伸ばして) 扱うことにより、うるう秒が無かったかのようにシステムが動きます。
これはGoogle Apps Scriptでうるう秒を扱わないことと整合していると思います。