我有几个关于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