Я использую MyBatis ORM для взаимодействия между моим приложением Java 11 и базой данных MySql.Когда я хочу вставить объекты даты (пробные java.time.LocalDate
и java.sql.Date
) в таблицу (столбец имеет тип jdbc DATE
), все даты сдвигаются назад на 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 Mapper и Сервис:
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);
}
}
MyBatisxml:
<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
неявно устанавливают время в полночь ...: /