4

Spring MVC コントローラーで異なる日付形式を処理することは可能ですか?

私はこのような設定を知っています

@InitBinder
protected void initBinder(WebDataBinder binder) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
    binder.registerCustomEditor(Date.class, new CustomDateEditor(
            dateFormat, false));
}

私はdd/MM/yyyyフォーマットを処理できますが、日付もフォーマットで解析したい場合はどうすればよいyyyyMMddhhmmssですか? CustomDateEditorコントローラーに複数の を追加する必要がありますか?

4

6 に答える 6

4

スキッピー に影響をうけたサウンド

public class LenientDateParser extends PropertyEditorSupport {

private static final List<String> formats = new ArrayList<String>();

private String outputFormat;

static{
    formats.add("dd-MM-yyyy HH:ss");
    formats.add("dd/MM/yyyy HH:ss");
    formats.add("dd-MM-yyyy");
    formats.add("dd/MM/yyyy");
    formats.add("dd MMM yyyy");
    formats.add("MMM-yyyy HH:ss");
    formats.add("MMM-yyyy");
    formats.add("MMM yyyy");
}

public LenientDateParser(String outputFormat){
    this.outputFormat = outputFormat;
}

@Override
public void setAsText(String text) throws IllegalArgumentException {
    if(StringUtils.isEmpty(text))
        return;
    DateTime dt = null;
    for(String format : formats){

        try{

            dt = DateTime.parse(text, DateTimeFormat.forPattern(format));

            break;

        }catch(Exception e){
            if(log.isDebugEnabled())
                log.debug(e,e);
        }
    }
    if(dt != null)
        setValue(dt.toDate());
}

@Override
public String getAsText() {
    Date date = (Date) getValue();

    if(date == null)
        return "";

    DateTimeFormatter f = DateTimeFormat.forPattern(outputFormat);

    return f.print(date.getTime());

}
}
于 2012-10-09T20:56:01.150 に答える
3

これはどう。上記はすぐにうまくいかない可能性があります。

       public class MostLenientDateParser {
           private final List<String> supportedFormats;

           public MostLenientDateParser(List<String> supportedFormats) {
               this.supportedFormats = supportedFormats;
           }

           public Date parse(String dateValue) {
               for(String candidateFormat: supportedFormats) {
                   Date date = lenientParse(dateValue, candidateFormat);
                   if (date != null) {
                       return date;
                   }
               }
               throw new RuntimeException("tried so many formats, non matched");
           }

           private Date lenientParse(String dateCandidate, String dateFormat) {
               try {
                   return new SimpleDateFormat(dateFormat).parse(dateCandidate);
               } catch (Exception e) {
                   return null;
               }
           }
       }

これは、フォームデータ バインディングの CustomDateEditor 実装を介して Spring コンバーターから参照することもできます。

于 2012-07-04T08:51:14.140 に答える
3

同じ質問をしている他の人のために、Spring 3 を使用している場合は、モデルのフィールドで素晴らしい @DateTimeFormat(pattern="dd-MM-yyyy") を使用できます。

conversionService を org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter に登録してください。

同じ Bean に @DateTimeFormat を必要なだけ含めることができます。

于 2013-01-27T17:03:21.283 に答える
1

複数のロケールを扱う場合、寛大な日付フォーマッターを使用することはお勧めできません。10/11/2013 のような日付は、dd/MM/YYYY と MM/dd/YYYY の両方で正しく解析されます

于 2014-01-17T04:12:13.557 に答える
1

一度に 1 つの形式の日付しか受信しない場合は、単純DateFormatに形式に基づいて1 つのインスタンスを作成できます。

例えば

入力に基づいてフォーマットを決定する

DateFormat df = null;
if(recievedDate.indexOf("//")!=-1){
    df = new SimpleDateFormat("dd/MM/yyyy")
}else{
    df = new SimpleDateFormat("yyyyMMddhhmmss")
}
于 2012-07-04T08:09:24.247 に答える