2011-05-07 86 views
2

我有幾個關於java Date類的問題,它讓我很困惑。按日期分組,看看日期是否爲今天?

我有兩個問題:

  • 我有約會對象,我想看看是否存儲在其中的日期晚於開始當天的或不?所以,如果它晚於今天上午00:00?

  • 第二個問題是,我想按天分組幾個日期對象。但是,我不知道如何檢查它是否在特定日期的24小時內。

我認爲他們是有點相關,一旦我有一個日期對象的日期,它不能很難?

任何幫助非常感謝,Date類是真正困惑我..

回答

2

java日期/日曆類實際上很糟糕。

聽起來像你應該使用joda時間 - 特定LocalDate。

http://joda-time.sourceforge.net/key_partial.html

http://joda-time.sourceforge.net/api-release/org/joda/time/LocalDate.html

這應該解決這兩個#1和#2。

僅供參考 - JodaTime將最終取代JDK日期(JSR 310) 粗糙的分組解決方案:

public Map<LocalDate, List<Foo>> groupByDate(List<Foo> foos) { 
    Map<LocalDate, List<Foo>> groupedFoo = new HashMap()<..> 
    for(Foo foo : foos) { 
    Date javaDate = foo.getDate(); 
    LocalDate jodaDate = new LocalDate(javaDate); 
    List<Foo> dateGroupedFoos = groupedFoo.get(jodaDate); 
    if (null == dateGroupedFoos) { 
     dateGroupedFoos = new ArrayList()<..>; 
     groupedFoo.put(jodaDate, dateGroupedFoos); 
    } 
    dateGroupedFoos.add(foo); 
    } 
} 
+0

這看起來非常好,我會看看它。 Android應該已經使用這個 – networkprofile 2011-05-07 20:19:09

+0

FYI,[Joda-Time](http://www.joda.org/joda-time/)項目現在處於維護模式,團隊建議遷移到[java.time] (http://docs.oracle.com/javase/9​​/docs/api/java/time/package-summary.html)類。大部分java.time功能都被移植到[*** ThreeTen-Backport ***](http://www.threeten.org/threetenbp/)項目中的Java 6和Java 7中。在[*** ThreeTenABP ***](https://github.com/JakeWharton/ThreeTenABP)項目中進一步適用於早期的Android。請參閱[*如何使用ThreeTenABP ... *](http://stackoverflow.com/q/38922754/642706)。 – 2018-01-23 03:18:52

2

我有約會對象,我想看看是否存儲在它的日期比開始的電流後一天還是不?所以,如果它晚於今天上午00:00?

  1. 創建今天
  2. 復位小時分秒等
  3. 使用before method來比較日期。

第二個問題是,我想按天分組幾個日期對象。但是,我不知道如何檢查它是否在特定日期的24小時內。

只是按年份,月份和日期字段分組,或重置小時,分鐘和秒字段。

+0

事情是我不知道如何組織我的對象一般。我應該爲每天發生的事情創建一個ArrayList嗎? – networkprofile 2011-05-07 23:49:05

+0

我可能會使用'Map >'。 – aioobe 2011-05-08 05:15:32

0

天不總是在00:00

所以啓動,如果它是晚於今天上午00:00或不是

請注意,在某些日期的某些時區,該日不會從00:00:00開始。夏令時(DST)等異常意味着該日可能在另一時間開始,如01:00:00。

時區

確定一天的開始需要一個日期。確定一個日期需要一個時區。

時區對確定日期至關重要。對於任何特定的時刻,日期因地區而異。例如,Paris France午夜後幾分鐘是新的一天,而在Montréal Québec仍然是「昨天」。

continent/region的格式指定一個proper time zone name,如America/MontrealAfrica/Casablanca,或Pacific/Auckland。請勿使用3-4字母的僞區域,如ESTIST,因爲它們是而不是真正的時區,不是標準化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of("America/Montreal") ; 

LocalDate

LocalDate類表示沒有時間一天和不同時區的日期,唯一的價值。

LocalDate today = LocalDate.now(z) ; 

ZonedDateTime

讓java.time確定日期的第一刻。指定ZoneId以獲得ZonedDateTime對象。

ZonedDateTime todayStart = today.atStartOfDay(z) ; // Determine the first moment of the day in a particular time zone. 

比較

我想看看是否存儲在其中的日期晚於開始當天的或不?

使用的比較方法,isBeforeisAfterisEqual

boolean isFuture = ! (someZdt.isBefore(todayStart)) ; // A shorter way to say "is equal to or later" --> "is NOT before". 

Map & Set

我想通過天團幾個日期對象......我不知道我應該怎麼檢查它是否是24小時內的特定日期內。

首先,請記住,天不總是24小時。由於諸如DST之類的異常,它們可能長達23或25小時,或者其他長度。

因此,如果您想按日期跟蹤它們,請使用LocalDate而不是小時。您可以詢問每個ZonedDateTimeLocalDate

使用Map,具有作爲密鑰的日期僅部分(LocalDate),並與ZonedDateTime物體該日期保持在如Set爲地圖條目的值Collection

Map < LocalDate, Set <ZonedDateTime> > map = new HashMap <>(); 

下面是一個完整的示例代碼片段。您可以run this code live at IdeOne.com

Map < LocalDate, Set <ZonedDateTime> > map = new HashMap <>(); 
Set <ZonedDateTime> set = null; 

ZoneId z = ZoneId.of("Africa/Tunis"); 
LocalDate today = LocalDate.now(z); 
ZonedDateTime todayStart = today.atStartOfDay(z); // Determine the first moment of the day in a particular time zone. 
map.putIfAbsent(todayStart.toLocalDate() , new HashSet <>()); 
set = map.get(todayStart.toLocalDate() ) ; 
set.add(todayStart); 

ZonedDateTime zdt1 = todayStart.plusHours(6); 
map.putIfAbsent(zdt1.toLocalDate() , new HashSet <>()); 
set = map.get(zdt1.toLocalDate() ) ; 
set.add(zdt1); 

ZonedDateTime zdt2 = todayStart.plusDays(2); 
map.putIfAbsent(zdt2.toLocalDate() , new HashSet <>()); 
set = map.get(zdt2.toLocalDate() ) ; 
set.add(zdt2); 

ZonedDateTime zdt3 = todayStart.plusMonths(4); 
map.putIfAbsent(zdt3.toLocalDate() , new HashSet <>()); 
set = map.get(zdt3.toLocalDate() ) ; 
set.add(zdt3); 

System.out.println("map.toString(): " + map); 

我們希望看到在地圖上3項,這些價值觀之一是一組的兩個項目,而其他兩個值是一組每一個項目。請仔細閱讀此輸出內容,因爲HashSet確實按而不是按照放置順序返回項目。

map.toString():{2018-01-25 = [2018-01-25T00:00 + 01:00 [Africa/Tunis]],2018-01-23 = [2018-01-23T00 :00 + 01:00 [非洲/突尼斯],2018-01-23T06:00 + 01:00 [非洲/突尼斯]],2018-05-23 = [2018-05-23T00:00 + 01:00 [非洲/突尼斯]]}

爲了清楚起見,我們將其分開。我們看到1月23日有一套價值,而1月25日和5月23日都有單一價值。

2018年1月25日= [2018-01-25T00:00 + 01:00 [非洲/突尼斯]]

2018年1月23日= [2018-01-23T00:00 + 01 :00 [非洲/突尼斯],2018-01-23T06:00 + 01:00 [非洲/突尼斯]],

2018-05-23 = [2018-05-23T00:00 + 01:00 [Africa /突尼斯]


關於java.time

java.time框架內置於Java 8及更高版本中。這些類代替了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?