我有一个过期日期,在java中声明为localdate。在mariadb中保存时,将其保存为utc,即从原始时间中扣除5.5小时。所以,当我保存到期日期为“10-05-2018”时,它将保存在数据库中为“10-04-2018”。在检索时,我得到了正确的日期,即“10-05-2018”。如何确保它在数据库中也被保存为相同的日期?更新:很奇怪,它在我的机器数据库中显示不同的日期,但在不同的机器数据库中显示正确的日期。
dgiusagp1#
使用 DATE 在sql中,以及 LocalDate 在java中,这意味着永远不会有五个半小时的问题。
DATE
LocalDate
若要在数据库中存储仅日期的值(不含时间、时区或偏移量),请对列使用仅日期的数据类型。在sql标准和mariadb中,这都是 DATE .使用JDBC4.2和更高版本,您可以直接交换java.time对象,例如 LocalDate 用数据库。
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ; myPreparedStatement.setObject( … , ld ) ;
和检索。
LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
在调试这样的问题时,把你真正的应用程序代码放在一边,制作一个类似这样的演示应用程序,以简化问题并消除各种影响因素。下面是一个简单但完整的示例应用程序。为了简单起见,本例使用内置于java的h2数据库引擎。将此代码调整到特定的数据库服务器以生成mcve。
package com.basilbourque.example; import java.sql.*; import java.time.LocalDate; import java.time.Month; public class DateTest { public static void main ( String[] args ) { DateTest app = new DateTest(); app.doIt(); } private void doIt ( ) { try { Class.forName( "org.h2.Driver" ); } catch ( ClassNotFoundException e ) { e.printStackTrace(); } try ( Connection conn = DriverManager.getConnection( "jdbc:h2:mem:example_db;DB_CLOSE_DELAY=-1" ) ; // Set `DB_CLOSE_DELAY` to `-1` to keep in-memory database in existence after connection closes. Statement stmt = conn.createStatement() ; ) { // Create table. String sql = "CREATE TABLE event_ (\n" + " pkey_ IDENTITY NOT NULL PRIMARY KEY ,\n" + " name_ VARCHAR NOT NULL ,\n" + " when_ DATE NOT NULL\n" + ") ; "; System.out.println( sql ); stmt.execute( sql ); // Insert row. sql = "INSERT INTO event_ ( name_ , when_ ) " + "VALUES ( ? , ? ) ;"; try ( PreparedStatement preparedStatement = conn.prepareStatement( sql ) ; ) { String name = "whatever"; LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ; preparedStatement.setString( 1 , name ); preparedStatement.setObject( 2 , ld ); preparedStatement.executeUpdate(); } // Query all. sql = "SELECT * FROM event_ ;"; try ( ResultSet rs = stmt.executeQuery( sql ) ; ) { while ( rs.next() ) { //Retrieve by column name Long pkey = rs.getLong( "pkey_" ); String name = rs.getString( "name_" ); LocalDate ld = rs.getObject( "when_" , LocalDate.class ); //Display values System.out.println( "pkey: " + pkey + " | name: " + name + " | when: " + ld ); } } } catch ( SQLException e ) { e.printStackTrace(); } } }
当你跑的时候。pkey:1 |姓名:随便|时间:2018-01-23
1条答案
按热度按时间dgiusagp1#
热释光;博士
使用
DATE
在sql中,以及LocalDate
在java中,这意味着永远不会有五个半小时的问题。日期数据类型
若要在数据库中存储仅日期的值(不含时间、时区或偏移量),请对列使用仅日期的数据类型。
在sql标准和mariadb中,这都是
DATE
.使用JDBC4.2和更高版本,您可以直接交换java.time对象,例如
LocalDate
用数据库。和检索。
示例应用程序
在调试这样的问题时,把你真正的应用程序代码放在一边,制作一个类似这样的演示应用程序,以简化问题并消除各种影响因素。
下面是一个简单但完整的示例应用程序。
为了简单起见,本例使用内置于java的h2数据库引擎。将此代码调整到特定的数据库服务器以生成mcve。
当你跑的时候。
pkey:1 |姓名:随便|时间:2018-01-23