Как использовать Joda-Time с java.язык SQL.Отметка времени


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

INSERT INTO mst(time) VALUES (?);

где время имеет тип метка на PostgreSQL

2 60

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

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

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