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格式和其他引用的答案。
有两个问题。
- 格式string应该是
"yyyy-MM-dd HH:mm"
。 - 存储时间的数据types是
TimeStamp
而不是数据库中的Date
。
纠正这两个事情,你将能够存储和检索date与时间。
这是现代的答案。 其他答案在2013年写的时候都是很好的答案。一年之后,现代date和时间API出现了,代替了旧的类Date
, SimpleDateFormat
和朋友。 恕我直言,你应该现在使用新的类。 他们更加程序员友好。
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.sql
types。 不再需要。 我相信你可以使用JDBC 4.2驱动程序:
ps.setObject(3, newDate);
不过,我还没有用数据库testing过。 请注意,您使用setObject()
而不是setDate()
。