LoginSignup
5
3

More than 5 years have passed since last update.

Google Apps Scriptでうるう秒は問題になるか

Last updated at Posted at 2017-09-14

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でうるう秒を扱わないことと整合していると思います。

関連記事

Ruby等でのうるう秒とtimezone環境変数TZとの関係

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3