如何在Java中映射会议数据对应的日历时间?



这是我的类,我listOfmeeting标题和开始时间,我必须将所有会议日历日期保留为键和值List<MeetingModel>,就像假设今天的日历实例是Calendar.getInstance(),这将是键和两个会议列表作为值与其他相同。 我将如何实现这一目标?

public class Meeting {
public static void main(String[] args) {
ArrayList<Long> dateinmiliis = new ArrayList<>();
dateinmiliis.add(1512538200000L);
dateinmiliis.add(1516235400000L);
dateinmiliis.add(1516318200000L);
dateinmiliis.add(1516397400000L);
dateinmiliis.add(1516404600000L);
dateinmiliis.add(1516498200000L);
dateinmiliis.add(1516573800000L);
dateinmiliis.add(1516663800000L);
ArrayList<String> title = new ArrayList<>();
title.add("Decemer 6 meeting");
title.add("18thmeeting");
title.add("19th meeting");
title.add("20th first meeting");
title.add("20 the second meeing");
title.add("21th meeting");
title.add("21th second meeting");
title.add("23rd meeting");
ArrayList<MeetingModel> listOfmeeting = new ArrayList<>();
for (int i = 0; i < title.size(); i++) {
MeetingModel model = new MeetingModel();
model.setStarttime(dateinmiliis.get(i));
model.setTitle(title.get(i));
listOfmeeting.add(model);
}
HashMap<Calendar, List<MeetingModel>> mapEvents = new HashMap<>();
}
static void setMidnight(Calendar calendar) {
if (calendar != null) {
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
}
}
}
final ZoneId zone = ZoneId.of("Asia/Bangkok");
Map<LocalDate, List<MeetingModel>> mapEvents = listOfMeeting.stream()
.collect(Collectors.groupingBy(mm -> mm.getDate(zone)));
mapEvents.entrySet()
.forEach(e -> System.out.println("" + e.getKey() + " -> " + e.getValue()));

在我的电脑上打印:

2018-01-23 -> [2018-01-22T23:30:00Z 23rd meeting]
2018-01-22 -> [2018-01-21T22:30:00Z 21th second meeting]
2017-12-06 -> [2017-12-06T05:30:00Z Decemer 6 meeting]
2018-01-21 -> [2018-01-21T01:30:00Z 21th meeting]
2018-01-20 -> [2018-01-19T21:30:00Z 20th first meeting, 2018-01-19T23:30:00Z 20 the second meeing]
2018-01-19 -> [2018-01-18T23:30:00Z 19th meeting]
2018-01-18 -> [2018-01-18T00:30:00Z 18thmeeting]

日期不以任何特定的顺序出现,但您可以根据需要对地图条目进行排序,甚至可以使用SortedMap,通常是TreeMap

为了使上面的代码片段正常工作,我为MeetingModel安装了一种方便的方法:

public LocalDate getDate(ZoneId zone) {
return Instant.ofEpochMilli(startTime)
.atZone(zone)
.toLocalDate();
}

LocalDate是现代Java日期和时间APIjava.time中的一个类。我使用它至少有两个原因:(1)与过时的Calendar类相比,现代API更好用。 (2)LocalDate是一个没有时间的日期,正是我们所需要的情况,因此它大大简化了您的任务。有人告诉我,在较新的Android设备上,java.time内置的。在较旧的设备上,您可以通过ThreeTenABP使用它,请参阅底部的链接。

从输出来看,我似乎没有正确猜测您想要的时区,因为21th second meeting是从 1 月 22 日开始映射的。我相信您可以替换您想要的时区而不是亚洲/曼谷,从而解决此问题。

我还在MeetingModel中添加了一个toString方法。我的toString方法以UTC打印时间,同样,您可以做得更好。

提示:将构造函数与参数一起使用

顺便说一句,使用适当的构造函数来适应您的类,以使列表的初始化更简单且更具可读性:

ArrayList<MeetingModel> listOfMeeting = new ArrayList<>(List.of(
new MeetingModel(1512538200000L, "Decemer 6 meeting"),
new MeetingModel(1516235400000L, "18thmeeting"),
new MeetingModel(1516318200000L, "19th meeting"),
new MeetingModel(1516397400000L, "20th first meeting"),
new MeetingModel(1516404600000L, "20 the second meeing"),
new MeetingModel(1516498200000L, "21th meeting"),
new MeetingModel(1516573800000L, "21th second meeting"),
new MeetingModel(1516663800000L, "23rd meeting")));

在上面,我使用的是Java 9中引入的新List.of方法。在早期的Java版本中,只需使用旧的Arrays.asList

ArrayList<MeetingModel> listOfMeeting = new ArrayList<>(Arrays.asList(

不过,有一个区别:Arrays.asList会接受null会议,List.of不会。

链接

  • Oracle 教程:日期时间,介绍如何使用java.time
  • Java 规范请求 (JSR) 310,其中首次描述了java.time
  • ThreeTen Backport 项目,将java.time向 Java 6 和 7 的反向移植(JSR-310 为 ThreeTen)。
  • ThreeTenABP,ThreeTen Backport 的安卓版
  • 问:如何在Android项目中使用ThreeTenABP,并进行了非常详尽的解释。

最新更新