我有一個MySQL中的日期時間字段,我通過調用result.getString('date')來訪問,現在我想檢查天氣當前日期和時間在Java中已超過MySQL時間或是在MySQL檢查天氣之前,結果是否被激活。比較MySQL和Java時間
來自MySQL的日期時間格式爲:2011-12-30 17:10:00
,我該如何將此字符串與Java時間進行比較?
我有一個MySQL中的日期時間字段,我通過調用result.getString('date')來訪問,現在我想檢查天氣當前日期和時間在Java中已超過MySQL時間或是在MySQL檢查天氣之前,結果是否被激活。比較MySQL和Java時間
來自MySQL的日期時間格式爲:2011-12-30 17:10:00
,我該如何將此字符串與Java時間進行比較?
此前JDK 8
您可以使用ResultSet.getDate('date')
中檢索Date對象。然後使用方法Date.before()
或Date.after()
進行檢查。
JDK 8或更高版本
參考下面羅勒布爾克的answer。
'getDate'返回'java.sql.Date'應被歸一化,使得時間是0:00:00正確的是使用'getTimestamp'。 – 2011-06-01 15:46:12
爲什麼我們必須將時間歸一化到00:00:00。在這個問題中,他想要「檢查當前的日期和時間」。 – Genzer 2011-06-01 16:19:25
我們?我們不需要。這是由司機正常化,這就是問題所在。 – 2011-06-01 18:15:24
在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.Date
和java.util.Calendar
。請參閱Should I use Java date and time classes or go with a 3rd party library like Joda Time?
也好奇,但會使用getTimestamp()而不是getDate()。由於OP使用getString()很好的答案。 – Mark 2011-06-01 20:30:34
@馬克你肯定是對的,編輯相應。 – 2011-06-01 20:32:23
爲什麼不使用getDate('date')
而不是getString()
並使用Date的before()
或after()
?
'getDate'返回'java.sql.Date'應被歸一化,使得時間是0:00:00正確的是使用'getTimestamp'。 – 2011-06-01 15:45:59
您可以使用Joda DateTime api,它非常易於比較日期,我們在使用mysql datetime格式和創建joda datetime對象以進行比較時有相同的要求。
如果你可以顯示一些代碼來展示_how_ Joda使這更容易,那將是有用的。 – 2011-06-01 20:48:30
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中查找文檔這些方法的詳細信息....
希望它可以幫助
使用'System.currentTimeMillis()'而不是創建日曆和日期來獲取當前的日期和時間。 「新的java.sql.Date(WIDTH)」是什麼?這不是日期時間 - 它只是日期 - 它也不是數據庫 - 它是使用給定(WIDTH)毫秒時間值的日期! – 2011-06-01 15:57:58
JDBC 4。2及更高版本:
Boolean isFutureTask = myResultSet.getObject("myDateColumn" , Instant.class)
.isAfter(Instant.now()) ;
舊JDBC:
Boolean isFutureTask = myResultSet.getTimestamp(…)
.toInstant()
.isAfter(Instant.now()) ;
其他的答案是正確的,但使用過時的類。該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零,追加Z
爲Zulu
這意味着UTC。 java.time類默認以ISO 8601格式解析/生成字符串。
String inputOriginal = "2011-12-30 17:10:00".
String input = inputOriginal.replace(" " , "T") + "Z" ;
Instant instant = Instant.parse(input);
您可以使用getTimestamp('date'),然後使用Date和Timestamp類的getTime方法進行比較。如果它確實在DB的字符串,然後我會使用的日期格式轉成日期和使用的getTime – karakuricoder 2011-06-01 15:09:59
@karakuricoder - 這一個答案(正確的,IMO),爲什麼張貼的評論? – 2011-06-01 15:48:40