parsing“YYYY-MM-dd HH:mm”时,SimpleDateFormat生成错误的date时间

我想parsingstring( YYYY-MM-dd HH:mm )到date,但是得到错误的date比预期。

码:

  Date newDate = null; String dateTime = "2013-03-18 08:30"; SimpleDateFormat df = new SimpleDateFormat("YYYY-MM-dd HH:mm", Locale.ENGLISH); df.setLenient(false); try { newDate = df.parse(dateTime); } catch (ParseException e) { throw new InvalidInputException("Invalid date input."); } 

生产date:2012年12月30日08:30 08:30(错误)

我尝试设置Lenientclosures,但没有运气。 感谢你的帮助。

更新

感谢Sudhanshu的答案,它帮助我解决了Java转换。 当我把上面的代码的返回dateinput到数据库中时,我得到的date是正确的,但时间总是是00:00。

 ps.setDate(3, new java.sql.Date(app.getDate().getTime())); 

YYYY应该是yyyy-

 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ENGLISH); 

请在这里查看SimpleDateFormat的文档
Java 6: http : //docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html
Java 7: http : //docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

使用小写字母Y,而不是大写字母。 即yyyy不是YYYY

在这里检查注释: Java简单date格式和其他引用的答案。

有两个问题。

  1. 格式string应该是"yyyy-MM-dd HH:mm"
  2. 存储时间的数据types是TimeStamp而不是数据库中的Date

纠正这两个事情,你将能够存储和检索date与时间。

这是现代的答案。 其他答案在2013年写的时候都是很好的答案。一年之后,现代date和时间API出现了,代替了旧的类DateSimpleDateFormat和朋友。 恕我直言,你应该现在使用新的类。 他们更加程序员友好。

  LocalDateTime newDate = null; String dateTime = "2013-03-18 08:30"; DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm", Locale.ENGLISH); try { newDate = LocalDateTime.parse(dateTime, dtf); } catch (DateTimeParseException e) { throw new InvalidInputException("Invalid date input."); } 

除了类名外,与旧代码没有什么不同。 与其他例子会有差异,典型的现代类将提供更清晰的代码和更less的错误机会。

对于差异的一个小示例,让我们尝试使用格式模式string,其中包含大写字母YYYY

  DateTimeFormatter dtf = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm", Locale.ENGLISH); 

现在代码抛出一个java.time.format.DateTimeParseException: Text '2013-03-18 08:30' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {MonthOfYear=3, DayOfMonth=18, WeekBasedYear[WeekFields[SUNDAY,1]]=2013},ISO resolved to 08:30 of type java.time.format.Parsed 。 很长,我知道。 要注意的是,它提到的领域中没有一年,只有一个WeekBasedYear。 这是不一样的; 你现在可能已经发现,这正是因为大写字母Y是以周为单位的年份(只有一个星期的数字是有用的),在那里你应该使用年份小写字母y 。 我认为这种行为比老class做得更有帮助:他们给了你一个错误的结果,假装一切都很好,并且把你完全置身事外。

接下来,我明白你想把你的date时间存储到数据库中。 在过去,您将转换为一些适当的java.sqltypes。 不再需要。 我相信你可以使用JDBC 4.2驱动程序:

  ps.setObject(3, newDate); 

不过,我还没有用数据库testing过。 请注意,您使用setObject()而不是setDate()