Java - 如何过滤日期列表?

时间:2017-03-08 08:24:59

标签: java collections java-8

我有一个以这种形式存储日期对象的列表:

Mon Jan 30 18:00:00 GMT+00:00 2017
Mon Jan 30 21:00:00 GMT+00:00 2017
Tue Jan 31 00:00:00 GMT+00:00 2017
Tue Jan 31 03:00:00 GMT+00:00 2017
Tue Jan 31 06:00:00 GMT+00:00 2017

我需要一种方法来过滤我的列表,并且只保留每天的最后日期。

这是我的代码的当前状态:

for(int i = 0; i< timeDate.size(); i++){

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(timeDate.get(i));

        int day = calendar.get(Calendar.DAY_OF_MONTH);
        int month = calendar.get(Calendar.MONTH);
        int hour = calendar.get(Calendar.HOUR);

        for(int j=i; j<timeDate.size(); j++){
            Date currentDate = timeDate.get(j);
            calendar.setTime(currentDate);

            int dayC = calendar.get(Calendar.DAY_OF_MONTH);
            int monthC = calendar.get(Calendar.MONTH);
            int hourC = calendar.get(Calendar.HOUR);

            if(day==dayC && month==monthC && hourC > hour){
                timeDate.remove(i);
            }
        }
    }

2 个答案:

答案 0 :(得分:3)

你走了:

ReactDOM.findDOMNode(<instance-of-outermost-component>).getElementsByClassName('snap').length

答案 1 :(得分:1)

使用java.time

CalendarDate类已被java.time类取代。避免像瘟疫那样麻烦的遗留类。

将您所说的每个Date转换为Instant,在UTC的时间轴上转换。

Instant instant = myDate.toInstant();

收集到List

List<> instants = new ArrayList<>();
instants.add( myDate.toInstant() );
…
Collections.reverse( instants );  // if not already in descending sorted order. 

如Darshan的答案所示,制作一张LocalDateZonedDateTime的地图。

我们需要为Instant分配时区以获得àZonedDateTime。对于任何给定的时刻,日期在全球范围内因地区而异。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone();

提取LocalDate

LocalDate ld = zdt.toLocalDate();

使用它作为地图的关键。如果没有这样的密钥,请添加它并添加ZonedDateTime作为该Map条目的值。

如果该日期有密钥,请检索值ZonedDateTime并进行比较。与isAfter方法比较。如果以后有一个值,请替换该值。

提示:如果您按照最新的输入(例如Collections.reverse( instants ))对输入进行排序,则可以进行优化。如果您找到特定LocalDate的密钥,请不要通过拨打isAfter进行检查。您知道为该密钥输入的任何值都已是最新值。所以转到下一个输入。

您甚至可以通过查看地图来进一步优化。只记得添加到地图的最后LocalDate。通过调用LocalDate与传入的isEqual进行比较。如果相等,则转到下一个输入。