2

我写了一小段代码来暴露我的问题。

public class date {
    public static void main(String args[]) {
        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy",Locale.ENGLISH);
        System.out.println("The date format is : dd-MM-yyyy.");
        String date1 = "20-06-2012";
        System.out.println("The date1 is : " + date1);
        String date2 = "2012-06-20";
        System.out.println("The date2 is : " + date2);
        try {
            System.out.println(formatter.parse(date1).toString());
            System.out.println(formatter.parse(date2).toString());
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

输出如下所示:

The date format is : dd-MM-yyyy.
The date1 is : 20-06-2012
The date2 is : 2012-06-20
Wed Jun 20 00:00:00 EDT 2012
Mon Dec 03 00:00:00 EST 25

问题是我希望在提交的日期与 中指定的模式不匹配时引发错误SimpleDateFormat,不幸的是,它看起来像是在字符串中的正确位置看到数字,由破折号分隔,因此它通过了。是否有其他工具可以做到这一点,还是我错误地使用了SimpleDateFormat

4

2 回答 2

9

使用SimpleDateFormat.setLenient(boolean)并设置为false绕过 SDF 解析启发式。

然后切换到Joda-Time ;)

于 2012-06-14T20:14:18.687 回答
0

正如其他答案所说,您必须定义适合您数据的格式化程序。

java.time

Java 8 及更高版本与新的java.time框架(教程)捆绑在一起。这些新类取代了旧的 java.util.Date/.Calendar 和 java.text.SimpleDateFormat 类,这些类已被证明如此混乱和麻烦。这个新框架的灵感来自非常成功的Joda-Time库,由JSR 310定义,并由ThreeTen-Extra项目扩展。

此外,java.time 包括一个LocalDate仅表示日期的类,没有时间和时区,正如您在问题中所拥有的那样。

格式化模式以类似于 java.text.SimpleDateFormat 的方式定义,但可能略有不同。一定要学习文档

String input = "20-06-2012";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd-MM-yyyy" );
LocalDate localDate = LocalDate.parse( input , formatter );

转储到控制台。

System.out.println( "localDate : " + localDate );

跑的时候。

本地日期:2012-06-20

此处不需要语言环境

这里Locale.English不需要,因为您的数据中没有要翻译的月份或星期几的名称。

有关何时在解析/生成日期时间值的字符串表示时使用 Locale 的更多信息,请参阅何时Locale需要在 Java 中解析日期时间字符串?.

于 2015-09-27T23:19:02.833 回答