4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Struts2】リクエストパラメータの指定方法(日時情報を受け取る)

Posted at

概要

Struts2の"Type Conversion"(自動型変換機能)はDate型にも標準で対応しているが、
リクエストパラメータの指定方法によっては時刻情報が抜け落ちて変換されてしまう。

#パラメータの指定
パラメータを含めたURLを直打ちしてDate型変数「targetDate」に代入する。

時刻情報が抜け落ちる例。
targetDate=2016/01/01_12:30:00

当初、取り敢えず、と日付と時刻の間にアンダースコアを入れてみたところ
エラーで落ちることなくすんなり通ったため、
上手いこと許容してくれたと思っていたが、結果は2016年1月1日0時00分だった。

正しくは半角スペース。
targetDate=2016/01/01%2012:30:00

コンバータの処理を見てみる

中を見てみると、DefaultTypeConverterを継承したDateConverterにて変換が行われており、
フォーマットはDateFormatを使用している。

com.opensymphony.xwork2.conversion.impl.DateConverter.java

private DateFormat[] getDateFormats(Locale locale) {
    DateFormat dt1 = DateFormat.getDateTimeInstance(3, 1, locale);
    DateFormat dt2 = DateFormat.getDateTimeInstance(3, 2, locale);
    DateFormat dt3 = DateFormat.getDateTimeInstance(3, 3, locale);

    DateFormat d1 = DateFormat.getDateInstance(3, locale);
    DateFormat d2 = DateFormat.getDateInstance(2, locale);
    DateFormat d3 = DateFormat.getDateInstance(1, locale);

    DateFormat rfc3399 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");

    return new DateFormat[] { dt1, dt2, dt3, rfc3399, d1, d2, d3 };
}

DateFormat.SHORTからLONGまで(とRFC3399形式)が許容されている。

  • targetDate=16/01/01%2012:30
  • targetDate=2016-01-01T12:30:00
  • targetDate=2016/01/01%2012:30:00%20JST

標準のコンバータは結構ざっくりした作りになっているため、
自作コンバータにて他フォーマット対応や例外処理などを細かく実装し、使用する方が望ましい。

4
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
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?