代码之家  ›  专栏  ›  技术社区  ›  WolfmanDragon

如何将joda time与java.sql.timestamp结合使用

  •  61
  • WolfmanDragon  · 技术社区  · 15 年前

    我有一个 prepared statement

    INSERT INTO mst(time) VALUES (?);
    

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

    谢谢。

    2 回复  |  直到 15 年前
        1
  •  86
  •   Jack Leow    15 年前

    您可以先将joda日期时间转换为长时间(从epoch开始的毫秒数),然后从中创建时间戳。

    DateTime dateTime = new DateTime();
    Timestamp timeStamp = new Timestamp(dateTime.getMillis());
    
        2
  •  9
  •   facundofarias Ashay Batwal    10 年前

    jodatime的datetime构造函数现在可以为您处理这个问题。 (我不确定问题发布时是不是真的,但这是谷歌的一个顶级结果,所以我想我会添加一个新的解决方案。)

    有几个API选项:

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

    这两个选项都接受java.sql.timestamp,因为它扩展了java.util.date,但纳秒将被忽略(floored),因为datetime和date只有毫秒分辨率*。如果没有特定时区,则默认为datetimezone.utc。

    <教学模式
    “分辨率”是指提供的位数。“精度”是指表示的准确性。例如,mssql的datetime的分辨率为毫秒,但仅为秒精度的1/3(datetime2的分辨率可变,精度更高)。
    </教学模式>

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

    new DateTime(resultSet.getTimestamp(1));
    

    如果在数据库中对时区使用timestamp,那么就不能使用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));
    

    额外好处:datetimeformat forpattern静态地按模式缓存解析器,因此您不必这样做。

    <教学模式
    我通常建议在DBO模型中使用一个字符串,以使解析显式化并避免生成中间对象。(2013-11-14 09:55:25是否等于2013-11-14 09:55:25.000?)我通常尝试区分“数据库模型对象”为数据保留问题而优化和“业务模型对象”为服务级别使用而优化,两者之间有转换/映射层。我发现,基于CRUD的DAO直接生成业务对象往往会混淆优先级,对两者都不进行优化,因为遗漏了边缘案例,会从意想不到的地方抛出异常。有一个显式的转换层还允许您在必要时添加验证,比如如果您不控制数据源。分离关注点还可以更容易地独立地测试每个层。
    </教学模式>

    *如果您需要在业务模型中解析为纳秒级的解析,则必须使用其他库。

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