LoginSignup
3
3

More than 5 years have passed since last update.

Solrjの日時パースメソッドは危険

Last updated at Posted at 2014-10-24

Solrに付随しているライブラリ、SolrjにDateUtil.parseDate()というSimpleDateFormatクラスを使わずに文字列をDate型にパースしてくれる便利そうなメソッドがありますが、かなり危険なようです。

今のところ確認した事象

solrj 4.10.1で確認


1. DateクラスをtoString()で出力した文字列(EEE MMM d HH:flag_mm:ss z yyyy形式)が12時の時にこのメソッドを使うと時の部分が0時になってしまう。

java
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 HH:flag_mm:ss の文字列は全て yyyy-MM-dd 09:00:00 になってしまう。

java
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 HH:flag_mm:ss z yyyy形式のフォーマットが「EEE MMM d hh:flag_mm: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 hh:flag_mm:ss形式(もしくはyyyy-MM-dd HH:flag_mm:ss形式)を処理するより先に「yyyy-MM-dd」形式でパースされてしまうのが原因のようです。


現状ではSolrjの日時パーサーは使わない方がよさそうです。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3