Как преобразовать секунды в java.sql.Timestamp? - PullRequest
0 голосов
/ 12 апреля 2019

Мне нужно было обрезать миллисекунды до секунд и реализовать это следующим образом:

private static Long millisToSeconds(Long millisValue) {
    return TimeUnit.MILLISECONDS.toSeconds(millisValue);
}

Так что теперь он обрезает миллис, как ожидалось, например:

Long secondsValue = millisToSeconds(1554052265830L);
System.out.println("millisToSeconds ---> " + toSeconds); 
// Prints millisToSeconds ---> 1554052265

Но тогда я хочу преобразовать secondsValue в java.sql.Timestamp, но следующая реализация приводит к ошибке:

java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]

Что я должен исправить в своей реализации, чтобы преобразовать секунды в метку времени, чтобы полученная метка времени выглядела как 2019-03-31 11:45:06?

Ответы [ 3 ]

1 голос
/ 13 апреля 2019

java.time

Я предполагаю, что вы запрашиваете java.sql.Timestamp для использования с вашей базой данных SQL.В большинстве случаев вам не следует об этом просить.Класс Timestamp плохо спроектирован и сильно устарел, и современный драйвер JDBC или реализация JPA будут рады принять вместо него тип из java.time, современного Java-API даты и времени.

    long millisValue = 1_554_052_265_830L;
    Instant i = Instant.ofEpochMilli(millisValue);
    i = i.truncatedTo(ChronoUnit.SECONDS);
    System.out.println(i);

2019-03-31T17: 11: 05Z

Я не знаю, почему вы хотели урезать до секунд, но вы можете видеть, что это было сделано (или легко уйти)из этой строки).

Некоторые драйверы JDBC принимают Instant напрямую, когда вы передаете его в PreparedStatement.setObject (одна из перегруженных версий этого метода), даже если спецификация JDBC этого не требует.Если у вас нет, используйте OffsetDateTime.Преобразуйте так:

    OffsetDateTime odt = i.atOffset(ZoneOffset.UTC);
    System.out.println(odt);

2019-03-31T17: 11: 05Z

Вы можете видеть, что значение остается прежним, отличается только тип.

Что я должен исправить в своей реализации, чтобы преобразовать секунды в метку времени, чтобы полученная метка времени выглядела как 2019-03-31 11:45:06?

Во-первых, как я уже сказал, вы должныисправить ваш код, чтобы не требовать Timestamp, но вы также просите невозможного.Насколько я знаю, Timestamp.toString всегда будет производить по крайней мере один десятичный знак в секундах, поэтому он будет выглядеть как 2019-03-31 11:45:06.0.

Если вам сделать , вам обязательно понадобится Timestamp для устаревшего API, который вы не можете или не хотите менять прямо сейчас, конвертируйте Instant от:

    Timestamp ts = Timestamp.from(i);
    System.out.println(ts);

2019-03-31 19: 11: 05.0

Не обманывайтесь тем, что время выглядит иначе (19:11 вместо 17:11).Timestamp печатает в моем местном часовом поясе, который находится в Европе / Копенгагене, на 2 часа раньше, чем UTC с начала летнего времени (DST) 31 марта. Таким образом, у нас все еще есть тот же момент времени.

Ссылка: Учебное пособие по Oracle: Дата и время , объясняющее, как использовать java.time.

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

Ошибка предполагает, что вы используете Timestamp.valueOf(String) (возможно, с secondsValue.toString() в качестве аргумента?).

A java.sql.Timestamp - это специальная версия java.util.Date с наносекундной точностью для сериализации / десериализацииSQL TIMESTAMP значения.Это вовсе не второе значение.

Конструктор из Timestamp принимает значение в миллисекундах, а не второе значение (для наносекундной точности вам необходимо использовать отдельный setNanosс долями секунды (наносекунды).

В любом случае правильный способ будет использовать:

long milliseconds = ...; 
long seconds = TimeUnit.MILLISECONDS.toSeconds(milliseconds);
long truncatedMilliseconds = TimeUnit.SECONDS.toMillis(seconds);
// or truncatedMilliseconds = (milliseconds / 1000) * 1000;
Timestamp value = new Timestamp(truncatedMilliseconds);

Однако, поскольку вы говорите о необходимости определенного формата строки, яне уверен, что вам это нужно вообще.Если вы не используете JDBC для хранения этого значения в базе данных, вам не следует вообще использовать java.sql.Timestamp (и даже при использовании JDBC, вероятно, было бы лучше использовать java.time.LocalDatetime вместо этого).

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

Вы можете использовать SimpleDateFormat для форматирования даты согласно вашему требованию. Смотри ниже

    Long secondsValue = millisToSeconds(1554052265830L);
    System.out.println("millisToSeconds ---> " + secondsValue);
    Timestamp timeStamp = new Timestamp(secondsValue);
    String formattedDate = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss").format(timeStamp.getTime());
    System.out.println(formattedDate);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...