我正在使用MyBatis ORM在Java 11应用程序和MySql数据库之间进行交互。当我要将日期对象(尝试过java.time.LocalDate
和java.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.Date
和LocalDate
隐式地在午夜设置时间...:/
答案 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