我正在尝试使用SimpleDateFormat
的解析功能将String
转换为Date
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-YYYY");
String strInput1 = "29-04-2014";
System.out.println("string 1: " + strInput1);
Date date1 = new Date();
try {
date1 = sdf.parse(strInput1);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("date 1: " + date1.toString());
String strInput2 = sdf.format(date1);
System.out.println("string 2: " +strInput2);
Date date2 = new Date();
try {
date2 = sdf.parse(strInput2);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("date 2 " + date2);
date1
的输出为Mon Dec 30 00:00:00 GMT 2013
,然后正确解析为30-12-2014
。
我认为错误是在初始化sdf
时的某个地方。
答案 0 :(得分:7)
您正在使用周年<{1}} 。您的意思是YYYY
,即年。
只需将格式更改为:
yyyy
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
格式说明符很少使用,当 使用时,它应与YYYY
/ E
一起使用(星期几)姓名/号码)和u
(一周中的一周)。
请注意,您还应考虑设置w
的时区...此外,如果您使用的是Java 8,请使用SimpleDateFormat
包,否则{{3是一个比java.time
等更清晰的库。
答案 1 :(得分:0)
现代Java数据&amp; JSR-310中定义的时间API几乎是在问这个问题的时候出现的,所以我认为现在是时候回答它了。为了示例和解释,我们首先尝试保留不正确的格式模式字符串:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MM-YYYY");
String strInput1 = "29-04-2014";
System.out.println("string 1: " + strInput1);
LocalDate date1 = LocalDate.parse(strInput1, dtf);
System.out.println("date 1: " + date1.toString());
尝试解析strInput1
会产生java.time.format.DateTimeParseException: Text '29-04-2014' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {DayOfMonth=29, MonthOfYear=4, WeekBasedYear[WeekFields[SUNDAY,1]]=2014},ISO of type java.time.format.Parsed
。一方面,我认为例外是向前迈出的一步,而不是像你所经历的那样产生错误的日期。另一方面,如果没有更深入的新类知识,异常消息就不容易阅读。需要注意的是“WeekBasedYear”。这仅适用于周数,因此将其视为错误的标志。然后与the documentation进行比较。它表示u
表示年份,小写y
表示年份,大写Y
表示基于周的年份。假设一年将永远处于共同时代(“anno domini”),我们可以采用u
或y
:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MM-uuuu");
现在代码打印出来了:
string 1: 29-04-2014
date 1: 2014-04-29
我们还可以将日期格式化回字符串,当然:
String strInput2 = date1.format(dtf);
System.out.println("string 2: " +strInput2);
结果是我们从预期开始的字符串:
string 2: 29-04-2014
请注意,现代API附带一个LocalDate
类,用于没有时间的日期。在这种情况下,这会更精确地模拟您的需求,并避免因在Date
对象中拖动时间而导致的各种极端情况。
问题:我可以在Java 7中使用它吗?你当然可以。对于Java 6和7,获取ThreeTen Backport并开始使用现代类。