2011-05-07 80 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类?