2011-06-01 79 views
4

我有一個MySQL中的日期時間字段,我通過調用result.getString('date')來訪問,現在我想檢查天氣當前日期和時間在Java中已超過MySQL時間或是在MySQL檢查天氣之前,結果是否被激活。比較MySQL和Java時間

來自MySQL的日期時間格式爲:2011-12-30 17:10:00,我該如何將此字符串與Java時間進行比較?

+1

您可以使用getTimestamp('date'),然後使用Date和Timestamp類的getTime方法進行比較。如果它確實在DB的字符串,然後我會使用的日期格式轉成日期和使用的getTime – karakuricoder 2011-06-01 15:09:59

+0

@karakuricoder - 這一個答案(正確的,IMO),爲什麼張貼的評論? – 2011-06-01 15:48:40

回答

3

此前JDK 8

您可以使用ResultSet.getDate('date')中檢索Date對象。然後使用方法Date.before()Date.after()進行檢查。

JDK 8或更高版本

參考下面羅勒布爾克的answer

+3

'getDate'返回'java.sql.Date'應被歸一化,使得時間是0:00:00正確的是使用'getTimestamp'。 – 2011-06-01 15:46:12

+0

爲什麼我們必須將時間歸一化到00:00:00。在這個問題中,他想要「檢查當前的日期和時間」。 – Genzer 2011-06-01 16:19:25

+1

我們?我們不需要。這是由司機正常化,這就是問題所在。 – 2011-06-01 18:15:24

4

在Java中,你可以從一個字符串構造Date,使用SimpleDateFormat

String text = "2011-12-30 17:10:00"; 
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(text); 
Date now = new Date(); 

if (date.after(now)) 
{ 
    // do stuff 
} 

可以代替在數據庫中執行類似操作,使用基本的算術和(我認爲)相等運算符: +,-,>,<等,以及MySQL's date and time functions

...雖然我很想知道你爲什麼使用getString()而不是ResultSet#getTimestamp()。建議


另外一個詞:考慮使用Joda Time代替java.util.Datejava.util.Calendar。請參閱Should I use Java date and time classes or go with a 3rd party library like Joda Time?

+1

也好奇,但會使用getTimestamp()而不是getDate()。由於OP使用getString()很好的答案。 – Mark 2011-06-01 20:30:34

+0

@馬克你肯定是對的,編輯相應。 – 2011-06-01 20:32:23

1

爲什麼不使用getDate('date')而不是getString()並使用Date的before()after()

+0

'getDate'返回'java.sql.Date'應被歸一化,使得時間是0:00:00正確的是使用'getTimestamp'。 – 2011-06-01 15:45:59

0

您可以使用Joda DateTime api,它非常易於比較日期,我們在使用mysql datetime格式和創建joda datetime對象以進行比較時有相同的要求。

+1

如果你可以顯示一些代碼來展示_how_ Joda使這更容易,那將是有用的。 – 2011-06-01 20:48:30

-1

java.util.Calendar.getInstance().getTime().getTime()將讓你在毫秒

ResultSet.getDate('name of column').getTime() 

當前日期和時間將讓你從數據庫中的日期和時間....

u能比較/使邏輯運算,如你做以數字.....例如,這將檢查系統時間是否大於數據庫中的日期時間

java.util.Calendar.getInstance().getTime().getTime() > new java.sql.Date(WIDTH).getTime(); 

您可以在API中查找文檔這些方法的詳細信息....

希望它可以幫助

+2

使用'System.currentTimeMillis()'而不是創建日曆和日期來獲取當前的日期和時間。 「新的java.sql.Date(WIDTH)」是什麼?這不是日期時間 - 它只是日期 - 它也不是數據庫 - 它是使用給定(WIDTH)毫秒時間值的日期! – 2011-06-01 15:57:58

1

TL;博士

JDBC 4。2及更高版本:

Boolean isFutureTask = myResultSet.getObject("myDateColumn" , Instant.class) 
            .isAfter(Instant.now()) ; 

舊JDBC:

Boolean isFutureTask = myResultSet.getTimestamp(…) 
            .toInstant() 
            .isAfter(Instant.now()) ; 

java.time

其他的答案是正確的,但使用過時的類。該java.util.Date/.Calendar類已被內置到Java 8和後來的java.time框架所取代。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。

許多java.time功能被移植到Java中,並在ThreeTen-Backport中被移植到Java中,並進一步適用於Android中的ThreeTenABP

日期 - 時間類型

你應該存儲你的日期時間值作爲date-time type in your database。我相信,這將是在MySQL TIMESTAMP型(但我是一個男人Postgres我自己)。

然後使用java.sql.Timestamp類型到/從數據庫中的數據移動。

java.sql.Timestamp ts = myResultSet.getTimestamp(1); 

立即從java.sql轉換爲java.time。 java.sql類是那些已被證明設計不佳,令人困惑和麻煩的舊日期時間類的一部分。只有在更新JDBC驅動程序直接處理java.time類型之前,才使用它們。

java.util.Timestamp具有用於從一個Instant轉換爲/新方法。 Instant是UTC時間軸上的一個時刻,分辨率爲納秒。

java.time.Instant instant = ts.toInstant(); 

獲取當前時刻。

Instant now = Instant.now(); 

比較。

Boolean isStoredDateTimePast = now.isAfter(instant); 

JDBC 4.2和後,你的JDBC driver可能能夠直接從數據庫經由ResultSet::getObject方法訪問該值作爲Instant對象。


如果您必須分析該字符串,將其轉換爲標準的ISO 8601格式。用T替換中間的空格。假設字符串代表一個偏移從-UTC零,追加ZZulu這意味着UTC。 java.time類默認以ISO 8601格式解析/生成字符串。

String inputOriginal = "2011-12-30 17:10:00". 
String input = inputOriginal.replace(" " , "T") + "Z" ; 
Instant instant = Instant.parse(input);