Java 如何使用Spring表达式语言比较日期?

Java 如何使用Spring表达式语言比较日期?,java,spring,spring-el,Java,Spring,Spring El,有谁能给我举一些例子,说明如何使用SpringExpressionLanguange(Spel)来比较日期 我到处寻找,找不到符合我目的的东西。我使用的是Java 8,我有一个带有ZonedDateTime字段的响应对象,不知何故,我需要将它与YYYY-MM-DD形式的字符串进行比较——即:is before、is after、is equal,等等 ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.systemDefault());

有谁能给我举一些例子,说明如何使用SpringExpressionLanguange(Spel)来比较日期

我到处寻找,找不到符合我目的的东西。我使用的是Java 8,我有一个带有ZonedDateTime字段的响应对象,不知何故,我需要将它与YYYY-MM-DD形式的字符串进行比较——即:is before、is after、is equal,等等

ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.systemDefault());
HashMap<String, Object> testHash = new HashMap<>();
testHash.put("dateField", zonedDateTime);

ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariables(testHash);

Expression expression = parser.parseExpression("#dateField > '2016-01-01'");
ZonedDateTime ZonedDateTime=ZonedDateTime.now(ZoneId.systemDefault());
HashMap testHash=新HashMap();
testHash.put(“dateField”,zonedDateTime);
ExpressionParser=new SpelExpressionParser();
StandardEvaluationContext=新的StandardEvaluationContext();
setVariables(testHash);
Expression=parser.parseExpression(“#dateField>'2016-01-01'”);

上述措施显然不起作用。有人能给我举个例子吗?

我建议将字符串解析为Instant或ZoneDateTime或任何TemporalAccessor,然后使用接口ChronoZoneDateTime的方法compareTo(),该接口由TemporalAccessor扩展以比较两个日期。使用类将字符串解析为TemporalAccessor。(方法parse()。您的代码可能如下所示:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
TemporalAccessor ta = dtf.parse(yourDateString);
boolean result = yourZonedDateTime.compareTo(ta);
这是一个起点。您还可以看到这篇文章,它解释了如何将未知格式的字符串解析为日期。这可能会有帮助


下面是使用Java 8 Java.time包和Spring表达式语言进行日期比较的代码。希望这有帮助

import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import org.junit.Test;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import junit.framework.Assert;

public class TestDateSPEL {

@Test
public void testCompareDate() throws Exception {
    ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.systemDefault());
    String otherDate = "2010-12-25 12:00";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").withZone(ZoneId.systemDefault());
    ZonedDateTime zdtOtherDate = ZonedDateTime.parse(otherDate, formatter);
    //SpEL Context
    EvaluationContext context = new StandardEvaluationContext(new ZonedDateTimeUtil());
    context.setVariable("dateOne", zonedDateTime);
    context.setVariable("dateTwo", zdtOtherDate);
    //SpEL Parser
    ExpressionParser parser = new SpelExpressionParser();
    Expression exp = parser.parseExpression("compareDate(#dateOne, #dateTwo)");
    int value = (Integer) exp.getValue(context);
    //"zonedDateTime" is after "zdtOtherDate"
    Assert.assertEquals(1, value);
  }
}

class ZonedDateTimeUtil {
public int compareDate(ZonedDateTime dateOne, ZonedDateTime dateTwo){
    return dateOne.compareTo(dateTwo);
   }
}

请尝试这个例子,我希望它能帮助你

DateFormat destDf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date startDate;
Date endDate;
String strDate1="2016-08-09 00:00:00";
String strDate2="2015-11-19 00:00:00";
    startDate = destDf.parse(strDate1);
    endDate = destDf.parse(strDate2);
if(startDate.after(endDate)){
Object Date;
if(startDate.before(endDate))
if(startDate.equals(endDate))

//You can check date in java like this also
Date Date date = new Date();
if(date.getDate()==startDate.getDate() && date.getMonth()==startDate.getMonth() && date.getYear()==startDate.getYear()){
    System.out.println("Date1 is equal Date2");
}

这正是我要找的!谢谢!斯佩尔在哪里?困难的部分是使用斯佩尔,但在这个答案中没有提到斯佩尔。这里没有提到斯佩尔,这个答案不适用于这个问题。