Utilities.formatDate の仕様について 【ご報告】

1,290 views
Skip to first unread message

Ryohei Sawata

unread,
Feb 1, 2014, 7:14:43 AM2/1/14
to google-app...@googlegroups.com
沢田と申します。GASによる社内システムを担当しています。
GAS歴は2か月です。

質問というか、ご報告です。(私が無知なだけかもしれませんが(汗))


先週から毎晩走らせているスクリプトがあったのですが、2/1から出力がおかしくなりました。

調べてみると、1/31までは「2014年2月2日」と出力されていたものが、
「2014年2月32日」と出力されるようになり、
結果、エラーを吐くようになっていました。

問題のある関数を特定してみました。
Dateと追加時間を入力して、ISO8601のStringで戻ってくる関数
//'2014-02-02T00:00:00.000Z'
この形式で出力されるところが
//'2014-02-33T00:00:00.000Z'
と出力されるようになりました。

問題の関数です。
//JSTのDATE,追加時間(addhours)を入力すると、ISO8601形式のStringでリターン  
function computeDate(dt,addhours) {
  var dt = new Date(dt);
  var baseSec = dt.getTime();
  var addSec = addhours * 3600000;//日数 * 1日のミリ秒数
  var targetSec = baseSec + addSec;
  dt.setTime(targetSec);
  Logger.log(baseSec+","+addSec+","+targetSec+",dt: "+dt);
  var d = Utilities.formatDate(dt,"GMT+0900","yyyy-MM-DD");
  d += "T";
  d += Utilities.formatDate(dt,"GMT+0900","HH:mm");
  d += ":00.000Z";
  return d;
}

ここのUtilities.formatDate の 日数の定義が DD と 大文字であることが問題でした。
  var d = Utilities.formatDate(dt,"GMT+0900","yyyy-MM-DD");

DDをddと小文字に書き換えたらまた普通に動くようになりました。
  var d = Utilities.formatDate(dt,"GMT+0900","yyyy-MM-dd");


Utilities.formatDateを使うとき日数を指定する場合は dd と小文字を使うのが一般的だったようで、
そのコーディングミスはわたしの技術不足なので、なんともいえないところですが、

1/31までは使えていたけれど、2/1からつかえなくなった、というところが気になってしまいました。

GASは内部仕様が良く変わると仰っている方もいらっしゃるようです。

その類なのでしょうか・・・。

その類であれば、単なるご報告という形になります。

しかし、Javascriptの基本的なところで私が無知なだけかもしれないので、
他になにか原因があるのだとしたらご教授願いたいとも思いまして、投稿させていただきました。

突然失礼しました。

soundTricker

unread,
Feb 17, 2014, 4:22:30 AM2/17/14
to google-app...@googlegroups.com
こんにちはその記事を書いた大橋ことサントリーです。

GASはちょいちょい仕様が変わりますが、
割と最近は落ち着いてきています。

今回のケースですと、"yyyy-MM-DD"としており、
"DD"は一年の経過日数(つまり1月31日であれば31,2月1日であれば32となります)なので
2014-02-32と表示されていた事になります。

この辺りはわかりづらいのですが、
公式ドキュメントに「JavaのSimpleDateFormatのフォーマットを使っている」的なことが書いてあって
JavaのSimpleDateFormatのフォーマットを知っている必要があります。




Reply all
Reply to author
Forward
0 new messages