解析“YYYY-MM-dd HH:mm”时,SimpleDateFormat产生错误的日 期时间

问题描述 投票:12回答:4

我试图解析StringYYYY-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()));
java datetime simpledateformat datetime-parsing
4个回答
45
投票

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


7
投票

使用小盒子Y,而不是帽子。即yyyy不YYYY

检查这里的评论:Java Simple Date Format和那里引用的其他答案。


5
投票

有两个问题。

  1. 格式字符串应为"yyyy-MM-dd HH:mm"
  2. 存储时间的数据类型是TimeStamp而不是数据库中的Date

纠正这两件事,您将能够随时间存储和检索日期。


2
投票

这是现代的答案。其他答案在2013年写完时是很好的答案。在那之后的一年,现代的日期和时间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.");
    }

除了类名,它与旧代码没有什么不同。通过其他示例会有差异,通常现代类将提供更清晰的代码和更少的错误机会。

对于差异的一点点演示,让我们尝试使用大写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()

© www.soinside.com 2019 - 2024. All rights reserved.