Java日期解析特定格式

时间:2012-06-14 20:11:25

标签: java parsing date

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

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

2 个答案:

答案 0 :(得分:9)

使用SimpleDateFormat.setLenient(boolean) and set to false绕过SDF解析启发式。

然后切换到Joda-Time;)

答案 1 :(得分:0)

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

java.time

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

此外,java.time包含一个类LocalDate,仅代表一个日期,没有时间和时区,就像你在问题中一样。

格式化模式的定义方式与java.text.SimpleDateFormat类似,但可能略有不同。请务必研究doc

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

转储到控制台。

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

跑步时。

  

localDate:2012-06-20

此处不需要区域设置

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

有关何时在解析/生成日期时间值的字符串表示时使用Locale的详细信息,请参阅When is Locale needed for parsing date-time strings in Java?