将本地日期保存为utcin est区域-MariaDB

时间:2018-12-06 15:51:42

标签: java mariadb localdate

我有一个到期日期,在Java中声明为LocalDate。在MariaDB中保存时,将其保存为UTC,即从原始时间中扣除5.5小时。 因此,当我将有效期保存为'10 -05-2018'时,它将在数据库中保存为'10 -04-2018'。在检索即时消息时,我会获得正确的日期,即“ 10-05-2018”。

我如何确保将其保存为同一日期在数据库中?

更新:它很奇怪,它在我的计算机数据库中显示了不同的日期,但是在另一个计算机数据库中显示了正确的日期。

1 个答案:

答案 0 :(得分:2)

tl; dr

在SQL中使用DATE,在Java中使用LocalDate意味着永远不会有五个半小时的问题。

DATE数据类型

要在数据库中存储没有日期,没有时区或偏移量的仅日期值,请对列使用仅日期数据类型。

在SQL标准和MariaDB中,都为DATE

在JDBC 4.2和更高版本中,您可以直接与数据库交换 java.time 对象,例如LocalDate

LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
myPreparedStatement.setObject( … , ld ) ;

和检索。

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

示例应用

在调试此类问题时,请将您的实际应用程序代码放在一边,并制作一个此类的小样演示应用程序,以简化问题并消除各种影响因素。

这是一个简单但完整的示例应用程序。

为简单起见,本示例使用Java内置的H2 Database Engine。使此代码适合您的特定数据库服务器以创建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