Java 如何使用joda time确定数组列表中是否存在日期
您好,我正在寻找一种更好的方法,使用JodaTime确定Java中日期列表中是否存在日期。目前我使用的是:Java 如何使用joda time确定数组列表中是否存在日期,java,arraylist,jodatime,Java,Arraylist,Jodatime,您好,我正在寻找一种更好的方法,使用JodaTime确定Java中日期列表中是否存在日期。目前我使用的是: private static void dateSearch() { ArrayList<Date> dates = new ArrayList<>(); dates.add(formatDate("2016-08-18T05:18:24")); dates.add(formatDate("2016-08-17T05:18:24"));
private static void dateSearch() {
ArrayList<Date> dates = new ArrayList<>();
dates.add(formatDate("2016-08-18T05:18:24"));
dates.add(formatDate("2016-08-17T05:18:24"));
dates.add(formatDate("2016-08-19T17:00:24"));
Collections.sort(dates);
Date today=new Date();
int index=Collections.binarySearch(dates,today,new DateComparator());
if(index>=0){
System.out.println("Todays date was found " + index);
}
}
//Here is the formatDate Function that produces date objects from strings
private static Date formatDate(String dateString) {
String format="yyyy-MM-dd";
LocalDateTime dateTime = LocalDateTime.parse(dateString);
String dateCreated = dateTime.toString(format);
Date date = dateTime.toDate();
return date;
}
//Here is the comparator I am using for the binary search
private static class DateComparator implements Comparator<Date> {
private String format="yyyy-MM-dd";
@Override
public int compare(Date d1,Date d2){
LocalDateTime dt1 = new LocalDateTime(d1);
LocalDateTime dt2 = new LocalDateTime(d2);
return dt1.toString(this.format).compareTo(dt2.toString(this.format));
}
}
private static void dateSearch(){
ArrayList日期=新建ArrayList();
添加日期(格式日期(“2016-08-18T05:18:24”);
添加日期(格式日期(“2016-08-17T05:18:24”);
添加日期(格式日期(“2016-08-19T17:00:24”);
集合。排序(日期);
今天日期=新日期();
int index=Collections.binarySearch(dates,today,new DateComparator());
如果(索引>=0){
System.out.println(“找到今天的日期”+索引);
}
}
//下面是formatDate函数,它从字符串生成日期对象
私有静态日期格式日期(字符串日期字符串){
字符串格式=“yyyy-MM-dd”;
LocalDateTime-dateTime=LocalDateTime.parse(日期字符串);
字符串dateCreated=dateTime.toString(格式);
Date Date=dateTime.toDate();
返回日期;
}
//这是我用于二进制搜索的比较器
私有静态类DateComparator实现Comparator{
私有字符串格式=“yyyy-MM-dd”;
@凌驾
公共整数比较(日期d1,日期d2){
LocalDateTime dt1=新的LocalDateTime(d1);
LocalDateTime dt2=新的LocalDateTime(d2);
返回dt1.toString(this.format).compareTo(dt2.toString(this.format));
}
}
我使用的方法很有效,但我担心在比较一个大的日期列表时可能会占用很多资源和时间。有没有一种内在的方法可以让JodaTime做到这一点?
谢谢。您的代码可以缩减为:
List<LocalDate> dates = new ArrayList<>();
dates.add(LocalDateTime.parse("2016-08-18T05:18:24").toLocalDate());
dates.add(LocalDateTime.parse("2016-08-17T05:18:24").toLocalDate());
dates.add(LocalDateTime.parse("2016-08-19T17:00:24").toLocalDate());
System.out.println(dates.stream().anyMatch(LocalDate.now()::equals));
List dates=new ArrayList();
dates.add(LocalDateTime.parse(“2016-08-18T05:18:24”).toLocalDate());
dates.add(LocalDateTime.parse(“2016-08-17T05:18:24”).toLocalDate();
dates.add(LocalDateTime.parse(“2016-08-19T17:00:24”).toLocalDate();
System.out.println(dates.stream().anyMatch(LocalDate.now()::equals));
它实际上使用JodaTimeLocalDate
而不是java.util.Date
它不打印索引,但正如您所说,您只想检查是否存在。对列表排序具有时间复杂性
O(n log n)
。如果您只想知道该日期是否存在,请将在DateComparator
中完成的转换应用于列表中的每个日期以及要在列表中查找的日期。然后只需使用List.contains
确定是否包含该元素。这具有复杂性O(n)
为什么要在比较器中将日期
s转换为LocaDateTime
Date
也已经实现了Compariable
,如果你仍然要使用Date
,为什么还要使用JodaTime?你不应该用搜索时使用的相同比较器对列表进行排序吗?只是个主意,为什么不使用HashMap呢?@bradimus谢谢你的反馈。你是对的。这是个错误@venktavb在这种情况下,我更喜欢使用列表。我的主要目的是找到一种使用JodaTime来完成任务的方法。@task哦,那可能更容易阅读。我认为工厂方法是java.time的一种形式。双冒号不是Java8构造吗?他不会在Java8中使用JodaTime,因为这些类是经过烘焙而成的。谢谢@Jorn。这就是我一直在寻找的。我竭尽全力实现了一些可以用Stream轻松完成的事情。@LAROmega没有明确地说出来,所以我先尝试了一下。这里唯一的问题是,当前日期将通过隐式分配JVM的当前默认时区来确定。默认值会有所不同,即使在运行时也是如此!时区在确定日期时至关重要,因为对于任何给定的时刻,日期在全球各地都因区域而异。最好通过传递一个对象来明确所需/预期的时区。谢谢你,但我想要一个自定义格式的自定义日期搜索,这就是我为什么要这样做的原因。