簡體   English   中英

如何從Java中的MySQL數據庫檢索正確的時間戳?

[英]How do I retrieve the right timestamp from a MySQL database in Java?

我將測量結果存儲在MySQL數據庫中。 度量包含一個時間戳字段,該字段以以下格式存儲時間戳:

2015-10-10 10:10:10.11 (所以有兩位毫秒)

在我的Java代碼中,我使用以下方法檢索此值:

resultSet.getTimestamp(id)

當我打印此值時,它會給我:

2015-10-10 11:11:11.000000011

因此,我試圖弄清楚為什么它的行為如此,應該如何解決這個問題,以便獲得正確的價值?

編輯:

使用測量中的select *值時,這些值會正確顯示在數據庫內部

我猜它應該在Java / JDBC檢索方式的某個位置。 getTimestamp和getString都給我相同的結果。

編輯2:

resultSet = statement.executeQuery("select * from measurement");

Measurement m;

while(resultSet.next()) {
    m = new Measurement(
        resultSet.getString(1), 
        resultSet.getString(2), 
        resultSet.getDouble(4), 
        resultSet.getTimestamp(3));
    System.out.println(m);
}

我從不喜歡MySQL的JDBC驅動程序如何處理TIMESTAMP類型。 我會用:

select ROUND(UNIX_TIMESTAMP(col1)*1000) FROM measurement

然后用

java.util.Date d = new java.util.Date(resultSet.getLong(1));

我一直在研究實施。 即使有點麻煩,我還是發現了一些“有趣”的信息。

com.mysql.jdbc.ResultSet.getTimestamp()的實現有一些線索:

int year = 0;
int month = 0;
int day = 0;
int hour = 0;
int minutes = 0;
int seconds = 0;
int nanos = 0; <<< CLUE

if (numDigits < 9) {
    int factor = (int) (Math.pow(10, 9 - numDigits));
    nanos = nanos * factor;
}

TimeUtil.fastTimestampCreate(tz, year, month, day, hour, minutes, seconds, nanos);

因此,它似乎可以解析“。”之后的所有內容。 以納秒為單位,以前導零結尾。 因此.11變成.000000011.

所以我認為這可以解釋為什么會這樣...

解決此問題的方法可能有很多,其中包括:

  1. 獲取UNIX_TIMESTAMP作為user5449350的答案。
  2. 存儲UNIX_TIMESTAMPS而不是TIMESTAMP / DATETIME
  3. 更正有問題的Date對象並使用Calendar對其進行更正

     Date t = resultSet.getTimestamp(3); Calendar c = Calendar.getInstance(); c.setTime(t); c.set(Calendar.MILLISECOND, ((Timestamp)t).getNanos()); t = c.getTime(); 

暫無
暫無

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

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