8月になって発生したエラーの原因

Pocket

JavaScriptで書いたコードがあり、昨年末あたりから使っているのですが、8月になって、突然、エラーが発生しました。正確にはエラーでなくバグですが。
「すべてがFになる」という傑作ミステリがあります。これのメイントリックに似た現象で面白かったのでメモしておきます。

コードは次の通りです。

var str, ms, thisdate;
str = "20150814";
ms = str.match(/(\d{4})(\d{2})(\d{2})/);
thisdate = new Date(parseInt(ms[1]), parseInt(ms[2]) - 1, parseInt(ms[3]));
alert(thisdate);

8桁の文字列で表わした日付を日付オブジェクトに変換するというよくあるパターンです。
正規表現で4桁、2桁、2桁で切り取って、それぞれ年、月、日として整数に変換しています。
この整数への変換でparseIntを使ったのですが、これが問題でした。

上のコードは「20150814」について実行しています。結果は次の通りでした。
Sun Dec 14 00:00:00 UTC+0900 2014
「2014年12月14日」になってしまいました。
どうやら8月でなく0月と認識しているようです。
parseIntには引数が二つあり、一つ目は変換したい文字列、二つ目は基数です。基数は何進数かを表します。通常は10を指定し整数に変換します。
これを省略したのが原因でした。
省略すると文字列が「0」で始まる場合、基数を8として変換します。つまり8進数表記になります。ブラウザによっては別の動きをするようです。
parseInt("08")は「0」で始まるので、このケースに当てはまり、私の環境ではなんと「0」に変換されてしまうのでした。
次のように二つ目の引数をきちんとセットするのが正しい使い方です。

thisdate = new Date(parseInt(ms[1], 10), parseInt(ms[2], 10) - 1, parseInt(ms[3], 10));

この結果は次の通りです。
Fri Aug 14 00:00:00 UTC+0900 2015
意図通り「2015年8月14日」になりました。

いつ頃、このコードを書いたのかはっきりしませんが、10月から7月までは正しく変換され、8月と9月は「0」になるのでエラーになるというパターンでした。

[ 2015年8月14日 | カテゴリー: JavaScript | タグ: , ]

« | »

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

送信してください。


タグ

カテゴリー

最近の投稿

最近のコメント

固定ページ

アーカイブ

stabucky

写真

メタ情報