簡體   English   中英

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

[英]How to use Joda-Time with java.sql.Timestamp

我有一份准備好的聲明

INSERT INTO mst(time) VALUES (?);

其中time是PostgreSQL數據庫中Timestamp的類型。
我正在插入一個Joda-Time DateTime對象,或者我應該說我正在嘗試。 我找不到將DateTime對象轉換為java.sql.Timestamp的方法 我已經閱讀了Joda-Time文檔並且沒有參考這個。

謝謝。

您可以先將Joda DateTime轉換為long(自紀元以來的millis),然后再創建一個Timestamp。

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

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>

*如果您需要在商業模式中解析為納秒分辨率,則必須使用不同的庫。

**時間戳字符串格式可能因數據庫而異,但不確定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM