SimpleDateFormat的解析时产生错误的日​​期时间“YYYY-MM-DD HH:MM”(

2019-08-21 03:35发布

我试图解析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.");
}

生产:

太阳12月30日08:30:00 EST 2012(错误)

我尝试设置从宽关闭,但没有运气。

更新

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

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

Answer 1:

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



Answer 2:

使用小的情况下,Y,没有上限。 即YYYY不YYYY

这里检查意见: 简单的Java的日期格式 ,并引用有其他的答案。



Answer 3:

有两个问题。

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

分别修正的东西,你将能够存储并随时间检索日期。



Answer 4:

这里的现代答案。 其他答案被罚款的答案时,他们写在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 。 这是很长的,我知道。 要注意的事情是,没有一年的领域当中它提到,只有一个WeekBasedYear。 这是不一样的; 你现在可能认为这是正是因为大写想通了Y是基于星期年(只用了一个星期数usseful),你应该使用小写y为一年。 我认为这种行为有点比老班做了什么更多的帮助:他们给你一个结果是错误的,假装一切都很好,并在关于什么是错的黑暗完全离开你。

接下来,我知道你是想你的日期,时间存储到数据库中。 在过去,你会转换为一些适当的java.sql类型。 没有存在的必要。 我相信,随着一个JDBC 4.2驱动程序,你可以这样做:

    ps.setObject(3, newDate);

我还没有与数据库进行测试这一点,虽然。 请注意,您使用setObject()代替setDate()



文章来源: SimpleDateFormat producing wrong date time when parsing “YYYY-MM-dd HH:mm”