如何在java.sql.Timestamp中使用Joda-Time

时间:2009-07-01 23:24:38

标签: java postgresql timestamp jodatime

我有prepared statement

INSERT INTO mst(time) VALUES (?);

Timestamp数据库中的时间类型为PostgreSQL 我正在插入一个Joda-Time DateTime对象,或者我应该说我正在努力。我找不到将DateTime对象转换为java.sql.Timestamp的方法。我已经阅读了Joda-Time文档,但没有参考。

感谢。

2 个答案:

答案 0 :(得分:86)

您可以先将Joda DateTime转换为long(自纪元以来的毫秒),然后再创建一个Timestamp。

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

答案 1 :(得分:9)

JodaTime的DateTime构造函数现在可以为您处理。 (我不确定问题发布时是否属实,但这是谷歌的最高结果,所以我想我会添加一个更新的解决方案。)

有一些API选项:

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

两个选项都接受java.sql.Timestamp,因为它扩展了java.util.Date,但是Nanoseconds将被忽略(floored),因为DateTime和Date只有毫秒级的分辨率*。如果没有特定的时区,它将默认为DateTimeZone.UTC。

<教学模式>
“分辨率”是提供多少位数。 “精确度”是表示的准确程度。例如,MSSQL的DateTime具有毫秒级的分辨率,但只有约1/3的精度(DateTime2具有可变分辨率和更高的精度)。
< / Didactic Mode>

具有毫秒分辨率的UTC时间戳示例:

new DateTime(resultSet.getTimestamp(1));

如果您在数据库中使用TIMESTAMP WITH TIME ZONE,则无法使用java.sql.Timestamp,因为它不支持时区。您必须使用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));

Bonus:DateTimeFormat#forPattern通过模式静态缓存解析器,因此您不必这样做。

<教学模式>
我通常建议在DBO模型中使用String,以使分辨率明确,避免生成中间对象。 (2013-11-14 09:55:25是否等于2013-11-14 09:55:25.000?)我通常会尝试区分“数据库模型对象”优化数据保存问题和“业务模型对象”优化服务级别使用,其间包含转换/映射层。我发现基于CRUD的DAO直接生成业务对象往往会混淆优先级并优化两者,因为错过边缘情况而从意外的位置抛出异常。拥有显式转换层还允许您在必要时添加验证,例如,如果您不控制数据源。分离问题还可以更容易地独立测试每一层 < / Didactic Mode>

*如果您需要在商业模式中解析为纳秒分辨率,则必须使用其他库。

**时间戳字符串格式可能因数据库而异,不确定。