简单日期格式年份问题

3
我遇到了日期格式的问题。我正在使用SimpleDateFormat来解析日期,并使用MM/dd/yyyy格式解析日期,如果输入正确,如11/11/2011,则可以正常工作,并返回正确的结果(Fri Nov 11 00: 00:00 IST 2011)
但是,如果我们输入11/11/11作为输入,则无法正常工作(Wed Nov 11 00:00:00 IST 11),也不会提供解析错误。
public static void main(String[] args) {
    String format = "MM/dd/yyyy";
    String dt = "11/11/11";
    Date date = null;
    try {
        date = TestDate.parDate(dt, format);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    System.out.println(date);

}

public static Date parDate(String value, String dateFormat) throws ParseException {
    Date date = null;
    date = new SimpleDateFormat(dateFormat).parse(value);
    return date;
}

3
需要翻译的内容:you explicitly write that the year need to be on 4 digits (yyyy)您需要明确地写出年份需要为4位数字(yyyy)。 - jhamon
我建议您避免使用SimpleDateFormat类。它不仅过时,而且也出了名的麻烦。今天我们有更好的选择,java.time,这是现代Java日期和时间API。 - Ole V.V.
4个回答

3
如果您可以使用Java 8或以上版本,则可以使用DateTimeFormatterLocalDate类来解析日期值。如果输入格式不符合预期,它将抛出错误。
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("MM-dd-yyyy");
LocalDate date1 = LocalDate.parse("11-11-2011", formatter1);
System.out.println(date1);

上述代码将按预期工作,但如果您尝试使用相同的格式化对象解析“11-11-11”,则会收到异常。
Exception in thread "main" java.time.format.DateTimeParseException: Text '11-11-11' could not be parsed at index 6
at java.time.format.DateTimeFormatter.parseResolved0(Unknown Source)
at java.time.format.DateTimeFormatter.parse(Unknown Source)
at java.time.LocalDate.parse(Unknown Source)
at com.is.TestDate.main(TestDate.java:14)

2

使用 MM/dd/yy 格式来表示 11/11/1111/11/2011


1
只是一句话,但需要注意的是,当使用 MM/dd/yy 格式时,你可能会在跨越不同世纪的日期上出现错误。例如 01/01/20,你是指 1920 还是 2020? - Mathias G.
@Kuldeep 不用谢。如果您认为这个答案解决了您的问题,请将其标记为正确答案。 - zhh

1
如果你想进行严格的检查,使用SimpleDateFormat是不可能的。相反,你可以对日期字符串进行模式检查:
if (!dt.matches("\\d{2}/\\d{2}/\\d{4}")) {
    //throw exception
}

1
这不是问题。根据Java API的SimpleDateFormat,它对年份的模式说明如下:

对于解析,如果模式字母的数量大于2,则年份将被直接解释,而不考虑数字的数量。因此,使用模式"MM/dd/yyyy","01/11/12"解析为公元12年1月11日。

因此,由于您提供了有效的输入,所以不会抛出异常。
如果您必须处理一年的两种不同日期格式yyyyyy,请将一个版本转换为另一个版本,或者使用两个格式化程序 - 如果您必须使用SimpleDateFormat
这是自Java 8以来的方法: 如何使用LocalDateTime解析/格式化日期?(Java 8)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接