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

У меня естьподготовленное заявлени

INSERT INTO mst(time) VALUES (?);

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

Благодарность

Ответы на вопрос(2)

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

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

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

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

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

UTC Timestamp с разрешением в миллисекундах Пример:

new DateTime(resultSet.getTimestamp(1));

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

Timestamp без часового пояса со вторым разрешением Пример **:

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));

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

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

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

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

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

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

с начала эпохи), а затем создать временную метку.

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

ВАШ ОТВЕТ НА ВОПРОС