这是现代答案。其他答案在 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
. 很长,我知道。需要注意的是,它提到的字段中没有年份,只有一个 WeekBasedYear。这是不一样的; 并且您现在可能已经知道这正是因为大写Y
是基于周的年份(仅适用于周数),您应该使用小写y
的年份。我认为这种行为比旧课程更有帮助:他们给你一个错误的结果,假装一切都很好,让你完全不知道哪里出了问题。
接下来,我了解您要将日期时间存储到数据库中。在过去,您会转换为某种合适的java.sql
类型。不再需要。我相信使用 JDBC 4.2 驱动程序你可以做到:
ps.setObject(3, newDate);
不过,我还没有用数据库对此进行过测试。请注意,您使用setObject()
而不是setDate()
.