2012-06-13 65 views
1

我正在使用JSF 2.0和RichFaces 4.對於日期輸入,我試圖強制模式mm/dd/yyyy如何在<f:convertDateTime>中強制使用4位數年份格式

<h:inputText value="#{bean.startDate}"> 
    <f:convertDateTime pattern="mm/dd/yyyy"/> 
</h:inputText> 

當用戶實際進入一個2位數的年份的日期像這樣mm/dd/yy,則轉換器的年自動轉換到4個位數。這是不希望的。如何在不創建自定義轉換器的情況下阻止它這樣做?這是JSF轉換器中的錯誤嗎?

+0

''使用'java.text.SimpleDateFormat',所以它將使用您指定的任何SimpleDateFormat兼容模式以'pattern'屬性。如果你想要一個兩位數的年份,那麼使用'mm/dd/yy'。如果您希望該字段支持多種格式,那麼標準的轉換器不是您想要的。我不知道任何多格式轉換器,但我不明白爲什麼不能做。儘管這聽起來有點有趣。今年轉換爲4位數年份的問題是什麼? – pgreen2

回答

6

這不是一個錯誤。這就是SimpleDateFormat的工作原理。下面是從鏈接的javadoc一個引用的相關性:

  • 年份:如果格式化的Calendar是公曆,下面的規則。
    • ...
    • 用於解析,如果模式字母的數量爲2個以上,全年字面解釋,無論位數的數字。因此使用模式 「MM/DD/YYYY」, 「01/11/12」 解析到12年1月11日AD
    • ...

的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(個月)。

+0

我只會像你一樣擴展轉換器exampled,謝謝! BalusC! – user1413819

+0

@ user1413819如果這是對您的問題有用的答案,請不要忘記[將此帖標記爲答案](http://meta.stackexchange.com/a/5235/182862) –

相關問題