在Java中将日期作为字符串进行比较
我无法将日期作为字符串进行比较。我需要遍历一个集合,并将每个对象的日期值与作为参数传递的两个日期进行比较。这些日期都存储为字符串,我需要这样保存它们 众所周知,所有日期都将被格式化为在Java中将日期作为字符串进行比较,java,string,string-comparison,Java,String,String Comparison,我无法将日期作为字符串进行比较。我需要遍历一个集合,并将每个对象的日期值与作为参数传递的两个日期进行比较。这些日期都存储为字符串,我需要这样保存它们 众所周知,所有日期都将被格式化为YYYY-MM-DD。下面是我的意思的一个简单例子。谢谢大家 public ArrayList<Object> compareDates(String dateOne, String dateTwo) { for(Object object : objectCollection) {
YYYY-MM-DD
。下面是我的意思的一个简单例子。谢谢大家
public ArrayList<Object> compareDates(String dateOne, String dateTwo) {
for(Object object : objectCollection) {
String objectDate = object.getDate();
if(objectDate.equals(dateOne) || objectDate.equals(dateTwo)) { // Unsure of how to determine if the objects date is inbetween the two given dates
//add object to collection
}
}
return collection;
}
public ArrayList compareDates(字符串dateOne,字符串dateTwo){
for(对象:objectCollection){
字符串objectDate=object.getDate();
if(objectDate.equals(dateOne)| objectDate.equals(dateTwo)){//不确定如何确定对象日期是否在两个给定日期之间
//将对象添加到集合
}
}
回收;
}
以下是您需要遵循的步骤:
java.time.LocalDate
java.time.LocalDate
注意:您需要接受ArrayList
才能将字符串解析为LocalDate,而不是ArrayList
您可以参考。因为您的日期是
YYYY-MM-DD
格式,所以可以使用词典比较来确定两个日期之间的顺序。因此,您可以使用该方法来比较字符串:
int c1 = objectDate.compareTo(dateOne);
int c2 = objectDate.compareTo(dateTwo);
if ((c1 >= 0 && c2 <= 0) || (c1 <= 0 && c2 >= 0)) {
// objectDate between dateOne and dateTwo (inclusive)
}
int c1=objectDate.compareTo(dateOne);
int c2=objectDate.compareTo(dateTwo);
如果((c1>=0&&c2=0&&c2
和日期采用yyyy-MM-dd
格式,则字符串的比较应返回一致的结果:
if(objectDate.compareTo(dateOne) >= 0 && objectDate.compareTo(dateTwo) <= 0)
if(objectDate.compareTo(dateOne)>=0&&objectDate.compareTo(dateTwo)=dateOne&&objectDate如果dateOne在dateTwo之前,如果希望在两者之间有日期,可以使用以下比较
public ArrayList<Object> compareDates(List<Object> objectCollection, String start, String end) {
ArrayList<Object> dateBetween = new ArrayList<>();
for(Object object : objectCollection) {
LocalDate objectDate = parseDate(object.getDate());
if( !objectDate.isBefore(parseDate(start)) && !objectDate.isAfter(parseDate(end))) {
dateBetween.add(object);
}
}
return dateBetween;
}
private LocalDate parseDate(String date) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYY-MM-DD");
return LocalDate.parse(date, formatter);
}
public ArrayList compareDates(列表objectCollection、字符串开始、字符串结束){
ArrayList dateBetween=新的ArrayList();
for(对象:objectCollection){
LocalDate objectDate=parseDate(object.getDate());
如果(!objectDate.isBefore(parseDate(start))&&!objectDate.isAfter(parseDate(end))){
dateBetween.add(对象);
}
}
返回日期介于之间;
}
私有LocalDate parseDate(字符串日期){
DateTimeFormatter formatter=模式的DateTimeFormatter.of(“YYYY-MM-DD”);
返回LocalDate.parse(日期,格式化程序);
}
为什么要将日期作为字符串进行比较?有很多工具可以使日期的比较变得简单和精确,为什么不使用这些工具呢?如果您真的想坚持使用字符串,那么在比较之前转换为日期对象是唯一合理的方法,然后按将其拆分
并比较分离的值。您可能需要将它们转换为int
,然后……也许您可以使用SimpleDataFormat
从字符串中生成具体的Date
对象并对其进行比较。上面的示例看起来不完整,即它不包含objectCollection
variab的定义le.就像@Stultuske所说的,为什么要将它们作为streengs进行比较?你可以将它们解析为可比较的Calendar
s或Date
s。同意你的回答。但是,我想问题的作者所遇到的问题不是比较字符串,而是如何表达/实现“中间”以String.compareTo()表示的关系,返回一个int。也许您也可以扩展您的答案来解决这一部分。(@ernest_k的答案刚刚发布,添加了这样的解释)谢谢!在您和@ernest_k的答案之间,现在有很多意义了!我不认为转换为date更好。字符串比较快,转换慢,如果OP应该保持日期不变,就意味着每次都转换。也许您可以强调,您的实现只有在dateOne
是在dateTwo
@realponsign之前。这很容易,因为这只是本地日期值。如果引入时区、偏移量、夏令时复杂性,会怎么样?日期/时间类型显然更合适。比较字符串只需检查一次。转换字符串需要检查一次,然后还要执行以下操作:ng对日期和月份进行有效性检查。@Real怀疑论者没有争论你的观点。你在谈论性能,我在谈论准确性。但你有一个有效的观点,没有争论。在每个循环迭代中解析开始
和结束
可能会花费很多钱…是的,但是将日期作为字符串进行比较对我来说似乎有点棘手。你可以将它们作为日期,在方法开始时调用一次。这只是一个想法。这会提高性能吗?毕竟您有相同数量的日期要解析吗?如果集合中有N个项目,使用当前代码,则调用parseDate
3次(1次用于对象.getDate
,一次用于开始
,一次用于结束
)在每次迭代中,3*N
的总次数。但是只需要N+2
的次数(对于start
和end
只需要一次,对于N个对象中的每一个对象只需要一次)。如果您恰好有一个庞大的列表,那么这是大量不必要的DateTimeFormatter
实例化和调用parse
。