местная дата сохраняется как утренняя зона - MariaDB - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть срок действия, который объявлен как LocalDate в Java.При сохранении в MariaDB он сохраняется как UTC, то есть 5,5 часов вычитается из исходного времени.Поэтому, когда я сохраняю дату истечения срока действия как «10 -05-2018», она сохраняется в базе данных как «10 -04-2018».При извлечении я получаю правильную дату, то есть '10 -05-2018'.

Как мне убедиться, что она также сохраняется в базе данных на ту же дату?

Обновление: это странно, показывает другую дату в моей базе данных компьютеров, но показывает правильную дату в другой базе данных компьютеров.

1 Ответ

0 голосов
/ 06 декабря 2018

tl; dr

Использование DATE в SQL и LocalDate в Java означает, что никогда не будет проблемы пяти с половиной часов.

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 ) ;

Пример приложения

При отладке такой проблемы отложите свой реальный код приложения и создайте небольшое демонстрационное приложение, например, это, чтобы упростить проблему и устранить различные способствующие факторы.

Вот простой, но полный пример приложения.

В этом примере для простоты используется H2 Database Engine , встроенный в Java.Адаптируйте этот код к вашему конкретному серверу базы данных, чтобы получить 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

...