2016-08-06 46 views
0

我使用now()存儲數據庫表中的當前時間戳[示例-20160807000133] 我想比較表中存儲的此時間戳與java中的當前時間戳。比較java中存儲在數據庫中的時間戳

如何做到這一點?

我的主要任務是檢查表中存儲的數據是否在當前時間的一定時間間隔內。

+3

請張貼的你嘗試過什麼到目前爲止 – Sanghita

+1

這將是最容易做的查詢本身的時間戳比較的代碼,而無需從Java傳遞日期時間變量。您使用的是哪個數據庫,哪些表是您的查詢定位? –

回答

0

java.time

java.time框架是建立在Java 8和更高版本。這些課程取代了老的麻煩日期時間課程,如java.util.Date,.Calendar,& java.text.SimpleDateFormatJoda-Time團隊還建議遷移到java.time。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。

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

String input = "20160807000133"; 
DateTimeFormatter BASIC_ISO_DATETIME = DateTimeFormatter.ofPattern ("uuuuMMddHHmmss"); // Make constant somewhere in your codebase. 

LocalDateTime ldt = LocalDateTime.parse (input , BASIC_ISO_DATETIME); 

轉儲到控制檯。

System.out.println ("input: " + input + " | ldt: " + ldt); 

輸入:20160807000133 | LDT:2016-08-07T00:01:33

時區

請注意,您的輸入數據使得沒有包括有關時區或任何信息的錯誤偏移從-UTC。因此,它不是而是代表時間線上的一刻。如果這些數據是針對巴黎的,那麼這個數據與蒙特利爾的數據是不同的。

如果您知道特定時區的上下文,請在數據庫查詢中使用此值之前應用ZoneId

ZoneId zoneId = ZoneId.of ("America/Montreal"); 
ZonedDateTime zdt = ldt.atZone (zoneId); 

ZDT:2016-08-07T00:01:33-04:00 [美國/蒙特利爾]

數據庫

如果你的JDBC驅動程序與JDBC 4.2或更高版本的規定,您應該能夠通過setObject & getObject直接傳遞/獲取java.time類型。

如果不是,則使用添加到舊類的新方法進行轉換。對於java.sql.Timestamp,這意味着要經過Instant,這是UTC時間線上的一個時刻,分辨率高達納秒。我們可以從我們的ZonedDateTime中提取Instant對象。

java.sql.Timestamp ts = java.sql.Timestamp.from(zdt.toInstant()); 
myPreparedStatement.setTimestamp(ts); 

...和...

java.sql.Timestamp ts = myResultSet.getTimestamp(1); 
Instant instant = ts.toInstant(); 
ZoneId zoneId = ZoneId.of ("America/Montreal"); 
ZonedDateTime zdt = instant.atZone (zoneId);