News&Column

Daily Archives: 2008 年 2 月 29 日

apache commons net 1.4.1の閏年処理バグ

Calendar org.apache.commons.net.ftp.parser.FTPTimestampParserImpl.parseTimestamp(String timestampStr) throws ParseException
には、以下の処理がある

if (this.recentDateFormat != null) { parsed = recentDateFormat.parse(timestampStr, pp); }

recentDateFormatはdefaultとして”MMM d HH:mm”の書式を持っており、コレを元にparseを行った後年号を推定するような処理となっている

ここで、SimpleDateFormat#parse(String text, ParsePosition pos)の処理を見ると、
SUN JDKは年号の指定が無い場合Calendar.clear()した時間、即ちunix epoch timeを前提に時間の推定を行うよう実装されている

しかし、1970年はうるう年ではなかった為、SimpleDateFormat#setLenient(false)を呼んだparserでは、
2007-02-29T18:00のような時間はparse不可能な物として排除されてしまう。

なら、他のJVMなら上手く動くかも?と予測するが今更テストする気にもならない。
だって、既に2月29日になってしまっているのだから

続きを読む »