Подтвердить что ты не робот

Как использовать Joda-Time с java.sql.Timestamp

У меня есть подготовленный отчет

INSERT INTO mst(time) VALUES (?);

где время имеет тип отметка времени в PostgreSQL. Я вставляю объект Joda-Time DateTime, или я должен сказать, что я пытаюсь. Я не могу найти способ преобразовать объект DateTime в java.sql.Timestamp. Я прочитал документы Joda-Time и не вижу ссылок на это.

Спасибо.

4b9b3361

Ответ 1

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

DateTime dateTime = new DateTime();
Timestamp timeStamp = new Timestamp(dateTime.getMillis());

Ответ 2

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

Есть несколько вариантов API:

public DateTime(Object instant);
public DateTime(Object instant, DateTimeZone zone);

Обе опции принимают java.sql.Timestamp, потому что он расширяет java.util.Date, но Nanoseconds будут игнорироваться (наполовину), потому что DateTime и Date имеют только разрешение в миллисекундах *. Без определенного часового пояса по умолчанию будет DateTimeZone.UTC.

< Дидактический режим >
" Разрешение "- это количество цифр." Точность "- точная точность представления. Например, MSSQL DateTime имеет миллисекундное разрешение, но только ~ 1/3 второй точности (DateTime2 имеет переменное разрешение и более высокую точность).
</Дидактический режим >

Временная метка UTC с миллисекундным разрешением Пример:

new DateTime(resultSet.getTimestamp(1));

Если вы используете TIMESTAMP WITH TIME ZONE в своей базе данных, вы не можете использовать java.sql.Timestamp, потому что он не поддерживает часовые пояса. Вам нужно будет использовать ResultSet # getString и проанализировать строку.

Временная метка без часовой пояс со вторым примером разрешения **:

LocalDateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
    .parseLocalDateTime(resultSet.getString(1));

Временная метка UTC со вторым примером разрешения **:

DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
    .parseDateTime(resultSet.getString(1));

Временная метка с часовым поясом (формат смещения) со вторым примером разрешения **:

DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss Z")
    .parseDateTime(resultSet.getString(1));

Бонус: DateTimeFormat # forPattern статически кэширует парсеры по шаблону, поэтому вам не нужно.

< Дидактический режим >
Обычно я рекомендую использовать String в вашей модели DBO, чтобы сделать разрешение явным и избежать генерации промежуточных объектов. (Является ли 2013-11-14 09:55:25 равным 2013-11-14 09: 55: 25.000?) Обычно я стараюсь различать "объекты модели базы данных", оптимизирующие проблемы сохранения данных и "объекты бизнес-модели", оптимизирующие для использование уровня сервиса с уровнем преобразования/отображения между ними. Я нахожу, что DAO, основанные на CRUD, генерирующие бизнес-объекты, напрямую имеют тенденцию смешивать приоритеты и оптимизировать ни для одного, бросая исключения из неожиданных мест из-за случаев с пропущенными краями. Наличие явного слоя преобразования также позволяет добавить подтверждение, если необходимо, например, если вы не контролируете источник данных. Разделение проблем также облегчает тестирование каждого слоя независимо.
</Дидактический режим >

* Если вам нужно решить наносекундное разрешение в вашей бизнес-модели, вам придется использовать другую библиотеку.

** Временная шкала Строковый формат может отличаться от базы данных, но не уверен.