これはバグではありません。それがまさにそのSimpleDateFormat
仕組みです。リンクされたjavadocからの関連性の引用は次のとおりです。
- 年:フォーマッター
Calendar
がグレゴリオ暦の場合、次の規則が適用されます。
- ..。
- 構文解析では、パターン文字の数が2を超える場合、桁数に関係なく、年は文字通りに解釈されます。したがって、パターン「MM / dd / yyyy」を使用すると、「01/11/12」は西暦12年1月11日に解析されます。
- ..。
JSF<f:convertDateTime>
はそれを隠蔽して使用しています。最善の策はDateTimeConverter
、実際に渡す前に、送信された値の長さを拡張して検証することDateTimeConverter
です。カスタムコンバーターの作成を回避することはできませんが、結局のところ、それはかなり単純です。
@FacesConverter("myDateTimeConverter")
public class MyDateTimeConverter extends DateTimeConverter {
public MyDateTimeConverter() {
setPattern("MM/dd/yyyy");
}
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value != null && value.length() != getPattern().length()) {
throw new ConverterException("Invalid format");
}
return super.getAsObject(context, component, value);
}
}
次のように使用します。
<h:inputText ... converterMessage="Please enter date in MM/dd/yyyy format">
<f:converter converterId="myDateTimeConverter" />
</h:inputText>
mm
パターンの(分)をMM
(月)に固定したことに注意してください。