даты с Java на sql сдвинуты на один день - PullRequest
0 голосов
/ 29 апреля 2019

Я использую 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 неявно устанавливают время в полночь ...: /

1 Ответ

0 голосов
/ 30 апреля 2019

Попробуйте добавить serverTimezone=GMT%2B1 к URL-адресу подключения JDBC. например,

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

UPDATE
На самом деле это похоже на ошибку.
https://bugs.mysql.com/bug.php?id=93444

...