Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 简单日期格式年份格式问题_Java_Datetime_Java 8_Simpledateformat - Fatal编程技术网

Java 简单日期格式年份格式问题

Java 简单日期格式年份格式问题,java,datetime,java-8,simpledateformat,Java,Datetime,Java 8,Simpledateformat,我的日期格式有问题。我正在使用SimpleDataFormat解析日期,并使用MM/dd/yyyy格式解析日期,它的工作正常,输入正确,如2011年11月11日,并返回正确的结果(2011年11月11日星期五00:00:00) 但是如果我们输入11/11/11,那么它就不能正常工作(Wed Nov 11 00:00:00 IST 11),也不会给出解析错误 public static void main(String[] args) { String format = "MM/dd/yy

我的日期格式有问题。我正在使用SimpleDataFormat解析日期,并使用MM/dd/yyyy格式解析日期,它的工作正常,输入正确,如2011年11月11日,并返回正确的结果(2011年11月11日星期五00:00:00)

但是如果我们输入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;
}

对于
11/11/11
11/11/2011
使用
MM/dd/yy
,如果要进行严格的检查,使用SimpleDataFormat是不可能的。您可以改为对日期字符串进行模式检查:

if (!dt.matches("\\d{2}/\\d{2}/\\d{4}")) {
    //throw exception
}

这不是一个问题。根据
simpleDataFormat
的Java API,它是正确的。它说,关于:

对于解析,如果模式字母的数量超过2,则为年份 无论位数多少,都按字面解释。所以使用 模式“MM/dd/yyyy”、“01/11/12”解析为公元12年1月11日

因此,在提供有效输入时不会引发异常

如果一年中必须处理两种不同的日期格式,请将一个版本转换为另一个版本或使用两个格式化程序-如果必须使用
SimpleDateFormat


这是自Java8以来的方式:

如果可以使用Java8或更高版本,请使用和类来解析日期值。如果输入不是预期的格式,它将抛出错误

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)

您明确地写下年份需要在4位数(
yyyy
)上。我建议您避免使用
SimpleDateFormat
类。它不仅早已过时,而且还出了名的麻烦。今天,我们有很多更好的,只是一句话,但你必须注意,当使用MM/dd/yy格式时:当使用不同世纪的日期时,你可能会有错误。例如,20年1月1日,你的意思是1920年还是2020年?@Kuldeep不客气。如果您认为这个答案解决了您的问题,请检查它是否为正确答案。