§問題の概要
Irvine のスクリプト機能(DMonkey)において、new Date ('月 日, 年') で日付が正しく解釈されない。
1月(January)を渡した時は内部的にエラーになり現在の日付が返り、2月以降であれば一か月前の日付が返ってしまう。
元ネタ: http://hibari.2ch.net/test/read.cgi/win/1303889299/987n
テストコード
alert (new Date ('Jan 1, 2009'));
alert (new Date ('Feb 1, 2009'));
alert (new Date ('December 31, 1999 23:59:59'));
§原因
Dmonkey の ecma_misc.pas の function DateParse() 内で、EncodeDate() に渡す月データを GetMonth(sl[0]) - 1
として計算しているため。
EncodeDate() は Delphi の標準関数で、月データを 1~12 で受け取る。
§対策
自分でビルドできる場合は、前述のソースの - 1
を削除する(試していないけど多分それでいけるはず)。
ビルド環境がない場合は、バイナリを直接書き換える。
- バイナリエディタで irvine.exe を開く。
- 16進数で
FF 53 0C 8B 45 D0 E8 61 40 FF FF
というデータを検索する(1か所だけ見つかるはず)。
- その直後の
48
を 90
に書き換える。
Irvine 1.3.1.127 であれば以下のように書き換える。
00099F8F: 48 90
# dec eax
を nop
に書き換え。
§副作用
特に無いと思われる。