我有一个以这种形式存储日期对象的列表:
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);
}
}
}
答案 0 :(得分:3)
你走了:
ReactDOM.findDOMNode(<instance-of-outermost-component>).getElementsByClassName('snap').length
答案 1 :(得分:1)
Calendar
和Date
类已被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的答案所示,制作一张LocalDate
和ZonedDateTime
的地图。
我们需要为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
进行比较。如果相等,则转到下一个输入。