嗨我遇到了素面日历的问题。我正在开发一个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>
答案 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 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);
}