Как использовать Joda-Time с java.язык SQL.Отметка времени
У меня есть подготовленное заявление
INSERT INTO mst(time) VALUES (?);
где время имеет тип метка на PostgreSQL
2 ответа:
вы можете сначала преобразовать Joda DateTime в long (millis since The epoch), а затем создать временную метку из этого.
DateTime dateTime = new DateTime(); Timestamp timeStamp = new Timestamp(dateTime.getMillis());
конструктор DateTime JodaTime может справиться с этим для вас сейчас. (Я не уверен, что это было правдой, когда вопрос был опубликован, но это лучший результат Google, поэтому я решил добавить более новое решение.)
есть несколько вариантов API:
public DateTime(Object instant); public DateTime(Object instant, DateTimeZone zone);
оба варианта принимают java.язык SQL.Метка времени, потому что она расширяет java.утиль.Дата, но наносекунды будут проигнорированы (floored), потому что DateTime и Date имеют только разрешение миллисекунды*. Без определенного часового пояса он будет по умолчанию для использования datetimezone.Мирового.
"Разрешение" - это количество цифр, которые предоставляются. "Точность" - это то, насколько точно представление. Например, DateTime MSSQL имеет разрешение миллисекунды, но только ~1/3 второй точности (DateTime2 имеет переменное разрешение и более высокую точность).временная метка UTC с миллисекундным разрешением пример:
new DateTime(resultSet.getTimestamp(1));
если вы используете метку времени с часовым поясом в вашей базе данных, то вы не можете использовать Java.язык SQL.Метка времени, потому что она не поддерживает часовые пояса. Вам нужно будет использовать 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 статически кэширует Парсеры по шаблону, Так что вы и не надо.
Обычно я рекомендую использовать строку в вашей модели DBO, чтобы сделать разрешение явным и избежать создания промежуточных объектов. (Это 2013-11-14 09:55:25 равен 2013-11-14 09:55:25.000?) Я обычно пытаюсь различать" объекты модели базы данных", оптимизирующие проблемы сохранения данных, и" объекты бизнес-модели", оптимизирующие использование уровня обслуживания с промежуточным уровнем преобразования/отображения. Я нахожу, что Дао на основе CRUD создание бизнес-объектов напрямую имеет тенденцию смешивать приоритеты и оптимизировать ни для того, ни для другого, выбрасывая исключения из неожиданных мест из-за пропущенных крайних случаев. Наличие явного слоя преобразования также позволяет добавлять проверку при необходимости, например, если вы не управляете источником данных. Разделение проблем также облегчает независимое тестирование каждого слоя.* Если вам нужно разрешить к разрешению наносекунды в вашей бизнес-модели вам придется использовать другую библиотеку.
** формат строки метки времени может отличаться между базами данных, не уверен.