簡體   English   中英

Java:最小和最大日期范圍

[英]Java: Min and Max Date range

我從具有存儲日期值的數據庫中獲取一些數據,並且我讓用戶選擇他們想要查看數據的日期范圍。 我獲取這些日期范圍的所有代碼都有效,除了獲取所有時間的日期范圍的方法,這是最早可能的數據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;
    }

為什么不用

  1. 新日期(Long.MIN_VALUE)(公元前292269055年)
  2. 新日期(Long.MAX_VALUE)(公元292278994年)?

由於青蛙入侵挑戰了答案,我想我會仔細檢查

    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)明顯更小。

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

那段代碼對我有用,也許你不期望它返回的值?

開始時間:周一1月01日00:00:00太平洋標准時間1結束:周四4月17日21:34:08太平洋標准時間292269054

(如果包含堆棧跟蹤,將更容易提供幫助)

我懷疑可能通過設置年份然后分別為所有其他字段設置最大值來獲得溢出。 這會使你的結束時間在你的開始時間附近並導致所有記錄被拒絕。 您可以嘗試打印日歷時間以查看正在發生的事情。

正如seanizer指出的那樣,你真的讓它變得比它應該更復雜 - 處理這個問題的正確方法是在查詢中完全保留date子句。 這有時可能很困難,因為sql語句不是動態生成的。 但請注意,即使你無法在運行時修改sql,條件(在Oracle中)

start_date >= nvl(?, start_date)

如果提供的值為null並且填充了start_date,則將始終滿足。

暫無
暫無

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

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