Java到SQL日期偏移了一天

时间:2019-04-29 07:24:33

标签: java mysql mybatis ibatis

我正在使用MyBatis ORM在Java 11应用程序和MySql数据库之间进行交互。当我要将日期对象(尝试过java.time.LocalDatejava.sql.Date)插入表(​​列的类型为DATE的jdbc)时,所有日期都向后移了1天。

伪示例:

Entry entry1 = new Entry("John", LocalDate.of(2019,4,29))
Entry entry2 = new Entry("John", Date.valueOf("2019-04-29"))

这两种方法都将按以下方式存储在sql表中。

user  |date       |
------|-----------|
John  |2019-04-28 |

mysql服务器使用UTC,应用程序可能在不同的时区(GMT + 1,GMT + 2)上运行,但这不应该始终如一地改变日期吗?

java类:

public class Entry {
    public String user;
    public LocalDate date;
}

MyBatis映射器和服务:

import org.apache.ibatis.annotations.Mapper;
import java.util.List;

@Mapper
public interface UserEntryMapper {
    void saveEntry(@Param("entry") Entry entry);
}

public class UserEntryService {
    private final UserEntryMapper userEntryMapper;

    @Inject
    public UserEntryService(UserEntryMapper dbMapper){
        this.userEntryMapper = dbMapper;
    }

    @Transactional
    public void saveEntry(Entry entry) {
        userEntryMapper.saveEntry(entry);
    }
}

MyBatis xml:

<insert id="saveEntry">
   INSERT INTO `user_entry_list`
   (`user`, `date`)
   VALUES
   (#{entry.user}, #{entry.date, jdbcType=DATE});
</insert>

编辑: 我尝试以其他方式实例化java.util.Date

Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2019);
cal.set(Calendar.MONTH, Calendar.APRIL);
cal.set(Calendar.DATE, 29);
cal.set(Calendar.HOUR_OF_DAY, 0);
java.util.Date date = cal.getTime();

的确,这仍然会导致2019-04-28。但是,如果我输入cal.set(Calendar.HOUR_OF_DAY, 2),则会保存正确的日期。这意味着java.util.DateLocalDate隐式地在午夜设置时间...:/

1 个答案:

答案 0 :(得分:0)

尝试将serverTimezone=GMT%2B1添加到JDBC连接URL。例如

jdbc:mysql://127.0.0.1:3306/test?serverTimezone=GMT%2B1

更新
实际上,这似乎是一个错误。
https://bugs.mysql.com/bug.php?id=93444