我有如下的日期验证码,它不会抛出01/01/19211的parseException。
问题是什么有没有人有替代解决方案?我不能使用任何第三方库。
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
dateFormat.setLenient(false);
try {
resetPasswordUIBean.setDateOfBirth(dateFormat.parse(resetPasswordUIBean.getDateInput()));
} catch (ParseException e) {
//handleException
}
非常感谢
答案 0 :(得分:3)
没有问题。它接受19211年1月1日的有效日期。我知道文档中并不清楚,但“yyyy”接受超过4位数,超过9999年。
如果您想将日期限制在某个最大年份(例如,不是将来,如果这是一个出生日期),那么您可以通过查找Date
中的年份来轻松完成(当然是通过Calendar
)。你可能也想要最少一年。这些验证步骤是单独解析 - 基本上有很多日期是有效的作为日期但在您的上下文中无效。
答案 1 :(得分:1)
y
可以解析一个+数字的年份注意:两位数的年份将被解析为没有世纪的年份,例如19
将被解析为 0019
。如果您希望它是 2019
,请使用 yy
。
演示:
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/y", Locale.ENGLISH);
Stream.of(
"01/01/1",
"01/01/19",
"01/01/192",
"01/01/1921",
"01/01/19211"
).forEach( s -> System.out.println(LocalDate.parse(s, dtf)));
}
}
输出:
0001-01-01
0019-01-01
0192-01-01
1921-01-01
+19211-01-01
因此,您需要从结果日期中获取年份的值并验证年份,例如
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/y", Locale.ENGLISH);
int year = LocalDate.parse("01/01/19211", dtf).getYear();
if (year < 1900 || year > 9999) {
// Do this
} else {
// Do that
}
}
}
您可能还想查看prefer u
to y
。
从 Trail: Date Time 了解有关现代 Date-Time API 的更多信息。
注意:java.util
Date-Time API 及其格式 API SimpleDateFormat
已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。