2010-08-30 229 views
5

我從數據庫中抓取一些具有存儲日期值的數據,然後讓用戶選擇他們希望查看數據的日期範圍。我所有用於獲取這些日期範圍的代碼都是有效的,除了獲取覆蓋所有時間的日期範圍的方法(這將是最早可能的數據Java句柄的起始值)到最大可能日期的最終值之外。Java:最小和最大日期範圍

有什麼錯我的代碼,因爲我不能看到一個問題:

public static DateRange getAllTime() { 
     /** 
     * Get earliest possible 
     */ 
     Calendar c = Calendar.getInstance(); 
     c.set(
       c.getActualMinimum(Calendar.YEAR), 
       c.getActualMinimum(Calendar.MONTH), 
       c.getActualMinimum(Calendar.DAY_OF_MONTH), 
       c.getActualMinimum(Calendar.HOUR), 
       c.getActualMinimum(Calendar.MINUTE), 
       c.getActualMinimum(Calendar.SECOND) 
      ); 

     c.set(Calendar.MILLISECOND, c.getActualMinimum(Calendar.MILLISECOND)); 
     Date start = c.getTime(); 

     /** 
     * Get latest possible date 
     */ 
     c.set(
       c.getActualMaximum(Calendar.YEAR), 
       c.getActualMaximum(Calendar.MONTH), 
       c.getActualMaximum(Calendar.DAY_OF_MONTH), 
       c.getActualMaximum(Calendar.HOUR), 
       c.getActualMaximum(Calendar.MINUTE), 
       c.getActualMaximum(Calendar.SECOND) 
      ); 

     c.set(Calendar.MILLISECOND, c.getActualMaximum(Calendar.MILLISECOND)); 
     Date end = c.getTime(); 

     DateRange range = new DateRange(); 
     range.Start = start; 
     range.End = end; 

     return range; 
    } 
+0

你的方法返回什麼? – 2010-08-30 06:05:51

回答

4

爲什麼讓生活如此複雜?如果您沒有開始日期,請不要查詢開始日期。如果您沒有結束日期,請不要查詢結束日期。如果您沒有,請不要查詢日期。

+0

哈哈是的,這就是我最終做的。這是一個特例,由於每個其他案例都有一些開始/結束,我只用了一種方法。結束了寫一個方法來覆蓋這種情況,並寫了一個查詢,沒有檢查日期。 這就是說,它讓我不知道,我真的很想知道爲什麼這不起作用。 – 2010-08-31 07:26:50

0

該代碼適用於我,也許你不期待它返回的值?

開始:星期六1月1日00:00:00 PST 1 結束:週三4月17日21時34分08秒的PST 292269054

(如果包括堆棧跟蹤這將是更容易幫助)

17

爲什麼不使用

  1. 新的Date(Long.MIN_VALUE)(在公元前292269055)新的Date(Long.MAX_VALUE)(在公元292278994)

由於froginvasion挑戰的答案,我想我會仔細檢查

long day=1000*60*60*24; 
    System.out.println(new Date(Long.MAX_VALUE-day)); 
    System.out.println(new Date(Long.MAX_VALUE)); 
    System.out.println(new Date(0)); 
    System.out.println(new Date(-day)); 
    System.out.println(new Date(Long.MIN_VALUE)); 
    System.out.println(new Date(Long.MIN_VALUE+day)); 

給我

Sat Aug 16 07:12:55 GMT 292278994 
Sun Aug 17 07:12:55 GMT 292278994 
Thu Jan 01 00:00:00 GMT 1970 
Wed Dec 31 00:00:00 GMT 1969 
Sun Dec 02 16:47:04 GMT 292269055 
Mon Dec 03 16:47:04 GMT 292269055 

我認爲這是正確的。我認爲AD/BC正在被壓制。建議使用新的Date(0)作爲最小值顯然是錯誤的,因爲新的Date(-day)顯然更小。

+0

簡單而優雅的解決方案! – nobre 2012-09-13 14:21:43

+0

同意!,非常好使用靜態值! +1 – will824 2012-11-13 20:13:51

+1

'新日期(Long.MIN_VALUE)'不會工作,測試它。它實際上並沒有做你期望的事情。如果你想使用這個,使用'1970年1月1日的新日期(0)'。 – froginvasion 2014-10-08 10:38:54

0

我懷疑可能會通過設置年份,然後爲所有其他字段分別設置最大值而導致溢出。這會讓你的結束時間在你開始時間的某個地方,並導致所有記錄被拒絕。您可以嘗試打印日曆時間以查看發生了什麼。

正如seanizer指出的那樣,你確實使這個問題變得比應該更復雜 - 解決這個問題的正確方法是在查詢中完全關閉date子句。這可能有時很困難,因爲sql語句不是動態生成的。但要注意的是,即使你不能在運行時修改的SQL,條件(在Oracle)

start_date >= nvl(?, start_date) 

永遠是滿意的,如果所提供的值爲null,並且填充起始日期。