Как использовать 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, генерирующие бизнес-объекты, имеют тенденцию смешивать приоритеты и оптимизировать ни то, ни другое, создавая исключения из неожиданных мест из-за пропущенных крайних случаев. Наличие явного слоя преобразования также позволяет при необходимости добавить проверку, например, если вы не контролируете источник данных. Разделение задач также облегчает независимое тестирование каждого слоя.
</ Дидактический режим>

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

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

 Basil Bourque11 дек. 2016 г., 02:51
FYI: Joda-Time проект, теперь вРежим технического обслуживани, советует перейти на Java.time классы.
 KarlKFI20 нояб. 2013 г., 18:01
Хотелось бы, чтобы они исправили слова в этой спецификации ... Java не контролирует точность аппаратного обеспечения, а точность является функцией точности и корректности (или «правильности»). Классы имеют РАЗРЕШЕНИЕ на наносекунду и имеют достаточно памяти для представления очень большого числа наносекунд.
 Basil Bourque20 нояб. 2013 г., 08:55
Что касается наносекунд ... К вашему сведению,JSR 310: API даты и времени встроенный в Java 8 и преемник Joda-Time действительно поддерживает разрешение наносекунд. Имейте в виду, что часы многих компьютеров не выдерживают такой степени детализации. В стороне: интересная заметка из спецификации JSR: Эти классы используют наносекундную точность. Классы имеют достаточную точность, чтобы представить любой наносекундный момент в текущем возрасте вселенной.
 Basil Bourque06 июл. 2014 г., 00:33
Я не понимаю твоего утверждения,If you're using TIMESTAMP WITH TIME ZONE in your database then you can't use java.sql.Timestamp. Несмотря на вводящее в заблуждение название, типTIMESTAMP WITH TIME ZONE на самом деле не хранит информацию о часовом поясе. Этот тип учитывает часовой пояс при вставке и извлечении значения даты и времени, но всегда сохраняет значение в UTC. Таким образом, мы можем получитьTIMESTAMP WITH TIME ZONE значение как тип JDBCjava.sql.Timestamp объект для подачи в конструкторorg.joda.time.DateTime экземпляр. Я тестировал с помощьюnow() функция.
 KarlKFI20 нояб. 2013 г., 18:02
Что касается вашего утверждения о гранулярности: некоторые системы не имеют наносекундного разрешения, а некоторые не имеют наносекундного разрешения или правильности. System.nanoTime (), вероятно, добавляет нули в любую систему, где операционная система не обеспечивает разрешение наносекунд, но это только увеличивает разрешение, а не точность, правильность или точность. Вот самый подробный источник, который я могу найти по терминологии: Tutelman.com / гольф / измерение / precision.php
Решение Вопроса

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

DateTime dateTime = new DateTime();
Timestamp timeStamp = new Timestamp(dateTime.getMillis());
 Dave Foster17 июл. 2013 г., 23:23
Для потомков, если вам нужно преобразовать метку времени в Joda DateTime,new DateTime(timeStamp.getTime()).
 Stephane05 дек. 2011 г., 00:28
@ Jack Leow Он имеет в виду, что если у DateTime есть часовой пояс, в котором день меняется в полночь, то при использовании временной метки, которая теряет часовой пояс, дата возвращается на один день назад. И вот как у вас есть модульные тесты DAO, которые терпят неудачу только около полуночи: -)
 Jack Leow10 июл. 2010 г., 01:11
Не могли бы вы уточнить, что вы имеете в виду? dateTime.getMillis () возвращает миллисекунды с начала эпохи, что учитывает часовой пояс.
 mP.09 июл. 2010 г., 06:14
Где насчет компонента TimeZone? Вы только «скопировали» дату и время, но не часовой пояс, который может повлиять на фактическое значение ...
 Gili20 июн. 2011 г., 17:12
Стоит отметить, что joda-time не хранит наносекунды, а Timestamp - нет. Любое преобразование между ними потеряет точность наносекунды.

Ваш ответ на вопрос