今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

SpringMVCのリクエストパラメータに含まれた日付を受けとる方法

ログを日付でフィルタリングをする実装をしてて、サーバ側のControllerの引数にDate型を書いたら、素直には動いてくれなかった。

クライアント側のコードがこちら。

    var params = 'fromTime=' + $('input[name=fromTime]').val() + '&toTime=' + $('input[name=toTime]').val();
    $.getJSON('${pageContext.request.contextPath/json/log?' + params, function (json) {
        update(json); // 画面更新
    });

サーバー側のControllerはこんな感じ。

    @RequestMapping(value = "/json/log", method = RequestMethod.GET)
    @ResponseBody
    public List<Log> log(@RequestParam(required = false) Integer page,
                        @RequestParam(required = false) Date fromTime,
                        @RequestParam(required = false Date toTime) {
        return logService.query(page, fromTime, toTime);
    }

クライアントはリクエストを送信してるのに、Controllerが呼ばれてない。
ぐぐってみたら、PropertyEditerとか使えばできるらしい。

Spring MVCでリクエストパラメータを日付型に変換してControllerに渡す - Fight the Future

そんなのめんどくさいからやりたくない。

    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

    @RequestMapping(value = "/json/log", method = RequestMethod.GET)
    @ResponseBody
    public List<Log> log(@RequestParam(required = false) Integer page,
                        @RequestParam(required = false) String fromTime,
                        @RequestParam(required = false String toTime) {
        Date ft = null;
        try {
            ft = dateFormat.parse(fromTime);
        } catch (Exception e) {}
        Date tt = null;
        try {
            tt = dateFormat.parse(fromTime);
        } catch (Exception e) {}
        return logService.query(page, ft, tt);
    }

これで日付のフィルタリングが動くようになった。
が、FromとToで同じ日を指定するとまったくヒットしない。
ちょっと考えてみたら、FromとToの両方が午前0時だからヒットしてないんだって気付いた。

というわけで、時刻まで指定するようにコードを修正して、期待通りに動くようになった。

    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");

    @RequestMapping(value = "/json/log", method = RequestMethod.GET)
    @ResponseBody
    public List<Log> log(@RequestParam(required = false) Integer page,
                        @RequestParam(required = false) String fromTime,
                        @RequestParam(required = false String toTime) {
        Date ft = null;
        try {
            ft = dateFormat.parse(fromTime + " 00:00:00.000");
        } catch (Exception e) {}
        Date tt = null;
        try {
            tt = dateFormat.parse(fromTime + "23:59:59.999");
        } catch (Exception e) {}
        return logService.query(page, ft, tt);
    }