【问题标题】:Java: Error while saving date value to database(Simpledataformat)Java:将日期值保存到数据库时出错(Simpledateformat)
【发布时间】:2017-03-25 19:20:32
【问题描述】:

我正在尝试在数据库中保存日期,但出现以下错误。我很困惑,因为我发送的是相同的格式但仍然抛出异常:

java.lang.IllegalArgumentException:时间戳格式必须是 yyyy-mm-dd hh:mm:ss[.fffffffff]

如果我在 SQL Developer 中尝试以下方式,它可以正常工作

to_date('01/01/1900', 'mm/dd/yyyy')

通过java我尝试做如下

第一种方法

SimpleDateFormat format1 = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
Date myDate = format1.parse("01/01/1900 00:00:00");

第二种方法

SimpleDateFormat format1 = new SimpleDateFormat("dd/MM/yyyy");
Date myDate = format1.parse("01/01/1900");

我哪里错了。

P.S:在将其标记为重复并阻止人们回答问题之前,请理解我已经尝试了一些方法并得到了错误。

【问题讨论】:

  • 您能否向我们展示您的代码中实际尝试写入 SQL 的部分
  • @alainlompo: row = new STRUCT(myNewRon, getConnection(), attributes);

标签: java date timestamp simpledateformat


【解决方案1】:

您的日期模式不匹配。

最好使用PreparedStatement,这样您就永远不会依赖字符串转换。

【讨论】:

    【解决方案2】:

    tl;博士

    myPreparedStatement.setObject(
        … , 
        LocalDate.parse( 
            "01/01/1900" , 
            DateTimeFormatter.ofPattern( "dd/MM/uuuu" )
        )
    )
    

    详情

    Answer by Just another Java programmer 是正确的。

    此外,您不应该使用字符串与数据库通信日期时间值。使用日期时间类。

    现代方式是使用 java.time 类,取代了麻烦的旧日期时间类。

    LocalDate

    LocalDate 类表示没有时间和时区的仅日期值。

    时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。例如,Paris France 中午夜后几分钟是新的一天,而 Montréal Québec 中仍然是“昨天”。

    ZoneId z = ZoneId.of( "America/Montreal" );
    LocalDate today = LocalDate.now( z );
    

    您可以直接从标准 ISO 8601 格式的字符串解析。

    LocalDate localDate = LocalDate.parse( "2016-01-23" );
    

    或者指定每个部分。

    LocalDate localDate = LocalDate.of( 2016, Month.JANUARY , 23 );
    

    要解析其他格式,请使用DateTimeFormatter 类。在 Stack Overflow 上搜索许多示例。

    数据库

    如果您的JDBC driver 符合JDBC 4.2 或更高版本,它应该能够使用PreparedStatement::setObject 传递java.time 类型并使用ResultSet::getObject 获取。

    myPreparedStatement.setObject( … , localDate );
    

    ……或者……

    myPreparedStatement.setObject( … , localDate , JDBCType.DATE );
    

    如果您的驱动程序未启用,请退回使用java.sql.Date。这个尴尬的类假装代表一个仅限日期的值(但实际上有一个时间组件设置为午夜,我们应该忽略它)。要与 java.time 相互转换,请查看添加到旧类的新方法。

    java.sql.Date sqlDate = java.sql.Date.valueOf( localDate );
    

    然后往另一个方向发展。

    LocalDate localDate = sqlDate.toLocalDate();
    

    传递给PreparedStatement::setDate

    myPreparedStatement.setDate( … , sqlDate );
    

    关于java.time

    java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

    Joda-Time 项目现在位于 maintenance mode,建议迁移到 java.time。

    要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

    从哪里获得 java.time 类?

    ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      相关资源
      最近更新 更多