Primefaces日历 - 不显示正确的日期

时间:2014-10-24 12:04:51

标签: java spring hibernate jsf primefaces

嗨我遇到了素面日历的问题。我正在开发一个Java Web应用程序,我有一个文本框和一个来自primefaces的日期选择器。 用户必须在文本框中输入他/她的dob作为字符串。然后,ajax事件会自动填充日期选择器。

例如:用户输入030589,日期选择器的值应为03/05/1989。 (意味着后者于1989年5月3日出生)

面临的问题是: 当用户输入051132时,日期选择器值为05/11/2032而不是05/11/1932。我也尝试这个值:150435,日期选择器值是15/04/35这是好的。 我不明白为什么它只发生在051132!你能帮帮我吗?

组件:

   public void setValueDOB(){
       SimpleDateFormat format = new SimpleDateFormat("dd/MM/yy");
       cur= emp.getDateInString();
       String day = cur.substring(0, 2);
       String month = cur.substring(2, 4);
       String year = cur.substring(4, 6);

       String dobTmp = day + "/" + month + "/" + year;

       dob = Calendar.getInstance();
       dob.setTime(format.parse(dobTmp));

       emp.setDob(dob);
    }

XHTML:

  <h:inputText id="dobTxt" value="Dob txt:"required="true" >
     <p:ajax update="dob" process="dobTxt" listener="#{Employee.setValueDOB()}" />
  </h:inputText>


 <h:outputText value="Title:" />

 <p:calendar disabled="false" pattern="dd/MM/yyyy" id="dob"
  value="#{EmployeeComponent.employee.dob}"
  required="true" converter="primefacesCalendarConverter" label="DOB"
  mindate="#{EmployeeComponent.dobMinDate}"maxdate="#{EmployeeComponent.dobMinDate}"                readonly="true">
 <f:validator validatorId="validatorForDOB" />

 </p:calendar>

3 个答案:

答案 0 :(得分:2)

它是由SimpleDateFormat的默认实现引起的。请参阅:http://docs.oracle.com/javase/1.5.0/docs/api/java/text/SimpleDateFormat.html

  

&#34;对于使用缩写的年份模式进行解析(&#34; y&#34;或&#34; yy&#34;),SimpleDateFormat必须解释相对于某个世纪的缩写年份。它通过将日期调整为创建SimpleDateFormat实例之前的80年和20年之后来实现这一点。&#34;

以下是您的情况:

  

现在:2014

     

第一次约会:2032年 - &gt;在+ 20年内

     

第二次约会:2035年 - &gt;不在+ 20年内 - &gt;发生了替代

答案 1 :(得分:2)

您可以使用

  

SimpleDateFormat.set2DigitYearStart(Date)

例如:

  

SimpleDateFormat dateformat = new   的SimpleDateFormat( “YY / MM / DD”,Locale.US);

     

日历c = Calendar.getInstance(Locale.US);

     

c.set(1900,0,1);

     

dateformat.set2DigitYearStart(c.getTime());

     

的System.out.println(dateformat.parse( “32年5月11日”));

答案 2 :(得分:0)

该应用必须将两位数转换为一年。现在这可能会有问题,因为50年基本上可能意味着1950年或2050年。我的建议是如果超过今年减少100年。例如:

  

如果年份是38,则将其读作2038年。因为2038年&gt; 2014年(今年),将年份减少100个。由此产生的年份是1938年。

     

如果年份为10,则将其视为2010年。因为2010&lt; = 2014,请保留。因此产生的一年是2010年。

最好的方法是以dd / MM / yyyy格式获得年份,因为这不会出错。


解决方案:

要解决您的问题,请执行以下更改:

public void setValueDOB(){
    SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
    cur= emp.getDateInString();
    String day = cur.substring(0, 2);
    String month = cur.substring(2, 4);
    String year = cur.substring(4, 6);

    int currentYear = Calendar.YEAR; // not sure about this
    if (Integer.parseInt(year) > currentYear - 2000) {
        year = "19" + year;
    } else {
        year = "20" + year;
    }

    String dobTmp = day + "/" + month + "/" + year;

    dob = Calendar.getInstance();
    dob.setTime(format.parse(dobTmp));

    emp.setDob(dob);
}