我写了一小段代码来揭露我的问题。
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
?
答案 0 :(得分:9)
使用SimpleDateFormat.setLenient(boolean)
and set to false
绕过SDF解析启发式。
然后切换到Joda-Time;)
答案 1 :(得分:0)
正如其他答案所说,你必须定义一个适合你数据的格式化程序。
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?。