【发布时间】:2014-07-25 09:10:21
【问题描述】:
所以我想将我的 dateinputfield 格式化为“dd-MM-yyyy”,然后验证日期不在明天之前。
这是我认为的相关代码:
<h:inputText id="dueDate" required="true" value="#{submitRepairBean.dueDate}">
<f:convertDateTime pattern="dd-MM-yyyy"/>
<f:validator validatorId="be.kdg.repaircafe.validators.DueDateValidator"/>
</h:inputText>
这是我的自定义验证器:
@FacesValidator("be.kdg.repaircafe.validators.DueDateValidator")
public class DueDateValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
System.out.println(value.toString()); //For some reason this prints Wed Jul 23 02:00:00 CEST 2014 when inputting 23-07-2014
DateTime date = new DateTime(value.toString());
long dueDateMillis = date.getMillis();
long oneDayMillis = 86400000;
Calendar tomorrowMidnight = new GregorianCalendar();
// reset hour, minutes, seconds and millis
tomorrowMidnight.set(Calendar.HOUR_OF_DAY, 0);
tomorrowMidnight.set(Calendar.MINUTE, 0);
tomorrowMidnight.set(Calendar.SECOND, 0);
tomorrowMidnight.set(Calendar.MILLISECOND, 0);
tomorrowMidnight.add(Calendar.DAY_OF_MONTH, 1);
if (dueDateMillis + oneDayMillis < tomorrowMidnight.getTimeInMillis()) {
throw new ValidatorException(new FacesMessage("You can not have something repaired before tomorrow!"));
}
}
现在我不明白的是为什么它不以转换后的格式 (dd-MM-yyyy) 打印,即使这样我也不在乎,只要我得到正确的毫秒数。 但是,DateTime 构造函数随后会引发日期格式无效的异常。
我也尝试过使用 SimpleDateFormat,但没有成功。
【问题讨论】:
-
尝试使用 Date date = (Date) value 转换您的值;到 java.util.Date 的日期对象,然后调用 new DateTime(date);
-
您也可以使用一些更具代表性的 id 作为验证器ID,例如 dateValidator 或birthdayValidator
-
仅供参考,麻烦的旧日期时间类,如
java.util.Date、java.util.Calendar和java.text.SimpleDateFormat现在是 legacy,被 Java 8 和 Java 中内置的 java.time 类所取代9. 见Tutorial by Oracle。
标签: java validation jsf date datetime