Как конвертировать 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()));