我有幾個關於java Date類的問題,它讓我很困惑。按日期分組,看看日期是否爲今天?
我有兩個問題:
我有約會對象,我想看看是否存儲在其中的日期晚於開始當天的或不?所以,如果它晚於今天上午00:00?
第二個問題是,我想按天分組幾個日期對象。但是,我不知道如何檢查它是否在特定日期的24小時內。
我認爲他們是有點相關,一旦我有一個日期對象的日期,它不能很難?
任何幫助非常感謝,Date類是真正困惑我..
我有幾個關於java Date類的問題,它讓我很困惑。按日期分組,看看日期是否爲今天?
我有兩個問題:
我有約會對象,我想看看是否存儲在其中的日期晚於開始當天的或不?所以,如果它晚於今天上午00:00?
第二個問題是,我想按天分組幾個日期對象。但是,我不知道如何檢查它是否在特定日期的24小時內。
我認爲他們是有點相關,一旦我有一個日期對象的日期,它不能很難?
任何幫助非常感謝,Date類是真正困惑我..
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);
}
}
我有約會對象,我想看看是否存儲在它的日期比開始的電流後一天還是不?所以,如果它晚於今天上午00:00?
before
method來比較日期。第二個問題是,我想按天分組幾個日期對象。但是,我不知道如何檢查它是否在特定日期的24小時內。
只是按年份,月份和日期字段分組,或重置小時,分鐘和秒字段。
事情是我不知道如何組織我的對象一般。我應該爲每天發生的事情創建一個ArrayList嗎? – networkprofile 2011-05-07 23:49:05
我可能會使用'Map
所以啓動,如果它是晚於今天上午00:00或不是
請注意,在某些日期的某些時區,該日不會從00:00:00開始。夏令時(DST)等異常意味着該日可能在另一時間開始,如01:00:00。
確定一天的開始需要一個日期。確定一個日期需要一個時區。
時區對確定日期至關重要。對於任何特定的時刻,日期因地區而異。例如,Paris France午夜後幾分鐘是新的一天,而在Montréal Québec仍然是「昨天」。
在continent/region
的格式指定一個proper time zone name,如America/Montreal
,Africa/Casablanca
,或Pacific/Auckland
。請勿使用3-4字母的僞區域,如EST
或IST
,因爲它們是而不是真正的時區,不是標準化的,甚至不是唯一的(!)。
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.
我想看看是否存儲在其中的日期晚於開始當天的或不?
使用的比較方法,isBefore
,isAfter
和isEqual
。
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
而不是小時。您可以詢問每個ZonedDateTime
的LocalDate
。
使用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 8及更高版本中。這些類代替了日期時間類legacy,如java.util.Date
,Calendar
,& SimpleDateFormat
。
Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310。
從何處獲取java.time類?
這看起來非常好,我會看看它。 Android應該已經使用這個 – networkprofile 2011-05-07 20:19:09
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