gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:46:00 26 4
gpt4 key购买 nike

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

如何确保它在数据库中也保存为相同的日期?

更新:很奇怪,它在我的机器数据库中显示不同的日期,但在不同的机器数据库中显示正确的日期。

最佳答案

tl;博士

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

示例应用

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

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

此示例使用 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 | name: whatever | when: 2018-01-23

关于java - 本地日期被保存为 utcin est 区域 - MariaDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53655069/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com