Solrに付随しているライブラリ、SolrjにDateUtil.parseDate()
というSimpleDateFormatクラスを使わずに文字列をDate型にパースしてくれる便利そうなメソッドがありますが、かなり危険なようです。
今のところ確認した事象
solrj 4.10.1で確認
1. DateクラスをtoString()で出力した文字列(EEE MMM d HHss z yyyy形式)が12時の時にこのメソッドを使うと時の部分が0時になってしまう。
import org.apache.solr.common.util.DateUtil;
public class DateTest {
public static void main(String[] args) throws ParseException {
String dateStr = "Fri Oct 24 12:11:57 JST 2014";
System.out.println(DateUtil.parseDate(dateStr));
}
}
出力結果は
Fri Oct 24 00:11:57 JST 2014
になります。
2. yyyy-MM-dd HHss の文字列は全て yyyy-MM-dd 09:00:00 になってしまう。
import org.apache.solr.common.util.DateUtil;
public class DateTest {
public static void main(String[] args) throws ParseException {
String dateStr = "2014-10-24 18:00:00";
System.out.println(DateUtil.parseDate(dateStr));
}
}
出力結果は
Fri Oct 24 09:00:00 JST 2014
になります。
実装を確認したところ、1.の事象に関しては、EEE MMM d HHss z yyyy形式のフォーマットが「EEE MMM d hh
ss z yyyy」で時の部分がAM、PMを区別しない「hh」になっているのが原因と思われます。
2.に関しては、処理するフォーマットが下記のような順番になっているので
yyyy-MM-dd'T'HH:mm:ss'Z'
yyyy-MM-dd'T'HH:mm:ss
yyyy-MM-dd
yyyy-MM-dd hh:mm:ss
yyyy-MM-dd HH:mm:ss
EEE MMM d hh:mm:ss z yyyy
EEE MMM d HH:mm:ss yyyy
EEEE, dd-MMM-yy HH:mm:ss zzz
EEE, dd MMM yyyy HH:mm:ss zzz
yyyy-MM-dd hhss形式(もしくはyyyy-MM-dd HH
ss形式)を処理するより先に「yyyy-MM-dd」形式でパースされてしまうのが原因のようです。
現状ではSolrjの日時パーサーは使わない方がよさそうです。