Как конвертировать java.util.Date в java.sql.Date

java.util.Date

У класса java.sql.Date есть конструктор, который принимает момент времени в миллисекундах от начала эпохи. Получить это значение из объекта класса java.util.Date очень просто:

java.util.Date utilDate = new java.util.Date();

java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());

java.time.LocalDateTime

При использовании современных классов для работы с датами можно использовать аналогичный подход. В случае LocalDateTime необходимо добавить данные о часовом поясе. Если часовой пояс не имеет значения, можно использовать константу ZoneOffset.UTC.

LocalDateTime modernDate = LocalDateTime.now();

java.sql.Date sqlDate = new java.sql.Date(modernDate.toInstant(ZoneOffset.UTC).toEpochMilli());

java.time.LocalDate

А при использовании LocalDate помимо часового пояса, нужно добавить данные из LocalTime о времени. К счастью, ничего выдумывать не нужно, если мы располагаем только датой, то в качестве сведений о времени подойдёт константа LocalTime.MIN, которая указывает на полночь 00:00. Также отметим, что метод LocalDate.toEpochSecond(LocalTime time, ZoneOffset offset) возвращает секунды, которые придётся умножить на 1000, так как нам требуются миллисекунды:

LocalDate modernDate = LocalDate.now();

java.sql.Date sqlDate = new java.sql.Date(modernDate.toEpochSecond(LocalTime.MIN, ZoneOffset.UTC) * 1000);

java.sql.TimeStamp

При передаче параметров в параметризованные запросы также пользуются методом setTimestamp для данных о дате и времени. Такой параметр может быть задан следующим образом:

preparedStatement.setTimestamp(1, Timestamp.valueOf(LocalDateTime.now()));