我试图解析String
(YYYY-MM-dd HH:mm
)到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.");
}
生产:
美国东部时间2012年12月30日08:30(错误)
我试过设置Lenient但没有运气。
更新
感谢Sudhanshu的回答,它帮助我解决了Java转换问题。当我从上面的代码输入返回的日期到数据库时,我正确地得到日期,但时间总是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 Simple Date Format和那里引用的其他答案。
有两个问题。
"yyyy-MM-dd HH:mm"
。TimeStamp
而不是数据库中的Date
。纠正这两件事,您将能够随时间存储和检索日期。
这是现代的答案。其他答案在2013年写完时是很好的答案。在那之后的一年,现代的日期和时间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.");
}
除了类名,它与旧代码没有什么不同。通过其他示例会有差异,通常现代类将提供更清晰的代码和更少的错误机会。
对于差异的一点点演示,让我们尝试使用大写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
。我知道,这很长。需要注意的是,它所提到的领域中没有一年,只有一周的基础年份。这是不一样的;你可能现在已经想到这正是因为大写的Y
是基于周的年份(只有一周的数字),你应该使用小写的y
一年。我认为这种行为比旧课程更有帮助:他们给了你一个错误的结果,假装一切都很好,让你完全不知道什么是错的。
接下来我知道您要将日期时间存储到数据库中。在过去,你会转换为一些适当的java.sql
类型。不再需要。我相信你可以使用JDBC 4.2驱动程序:
ps.setObject(3, newDate);
不过,我还没有用数据库对此进行过测试。请注意,您使用setObject()
而不是setDate()
。