如何在java.sql.Timestamp中使用Joda-Time
我有一个准备好的声明
INSERT INTO mst(time) VALUES (?);
在PostgreSQL数据库中,时间types是Timestamp 。
我插入Joda-Time DateTime对象,或者我应该说我正在尝试。 我可以find没有办法将DateTime对象转换为java.sql.Timestamp 。 我已经阅读了Joda-Time文档,没有提到这个。
谢谢。
您可以先将Joda DateTime转换为一个long(自纪元以来的毫秒),然后从中创build一个Timestamp。
DateTime dateTime = new DateTime(); Timestamp timeStamp = new Timestamp(dateTime.getMillis());
JodaTime的DateTime构造函数现在可以为你处理。 (当问题发布时,我不确定这是否是真实的,但这是谷歌的一个最好的结果,所以我想我会添加一个更新的解决scheme。)
有几个API选项:
public DateTime(Object instant); public DateTime(Object instant, DateTimeZone zone);
两个选项都接受java.sql.Timestamp,因为它扩展了java.util.Date,但是Nanoseconds将被忽略(floiled),因为DateTime和Date只有毫秒分辨率*。 没有特定的时区,它将默认为DateTimeZone.UTC。
<教学模式>
“分辨率”是提供了多less个数字。 “精度”是表示的准确程度。 例如,MSSQL的DateTime具有毫秒分辨率,但是只有第三精度(DateTime2具有可变分辨率和更高的精度)的〜1/3。
</教学模式>
UTC毫秒分辨率的时间戳示例:
new DateTime(resultSet.getTimestamp(1));
如果在数据库中使用TIMESTAMP WITH TIME ZONE,则不能使用java.sql.Timestamp,因为它不支持时区。 你将不得不使用ResultSet#getString并parsingstring。
无第二个分辨率的时区的时间戳示例**:
LocalDateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss") .parseLocalDateTime(resultSet.getString(1));
UTC时间戳与第二个解决scheme示例**:
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通过模式静态cachingparsing器,所以你不必。
<教学模式>
我通常build议在您的DBO模型中使用一个string,以便显式地parsing并避免生成中间对象。 (2013-11-14 09:55:25等于2013-11-14 09:55:25.000?)我通常会尝试区分针对数据保存问题进行优化的“数据库模型对象”和针对数据保存问题优化的“业务模型对象”服务级别的使用与中间的转换/映射层。 我发现使用基于CRUD的DAO直接生成业务对象往往会混淆优先级,并且不会优化,因为错过了边缘情况而抛出意外的地方的exception。 拥有一个显式的转换层也允许你在必要的时候添加validation,就像你不控制数据源一样。 分离问题也使得更容易独立地testing每个图层。
</教学模式>
*如果您需要在您的业务模型中parsing为纳秒级分辨率,则必须使用不同的库。
**时间戳string格式可能因数据库而异,不确定。