2016-08-08 57 views
0

任何人都可以给我任何使用Spring Expression Languange(Spel)比较日期的例子吗?如何使用Spring表达式语言比较日期?

我已经搜索了很多,我发现没有什么东西似乎适合我的目的。我使用的是Java 8,并且我有一个带有ZonedDateTime字段的响应对象,我需要将它与YYYY-MM-DD-IE形式的字符串进行比较:在之前,之后,等于等。

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'"); 

以上显然不起作用。任何人都可以给我看一个例子吗?

回答

1

下面是使用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); 
    } 
} 
+0

这也正是我要找的!非常感谢! –

0

我会建议将你的字符串解析为Instant或ZoneDateTime或任何TemporalAccessor,然后使用由TemporalAccessor扩展的接口ChronoZonedDateTime的方法compareTo()来比较两个日期。 See javadoc for compareTo()。使用类java.time.format.DateTimeFormatter来解析String到TemporalAccessor。 (方法解析())。您的代码可能如下所示:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd"); 
TemporalAccessor ta = dtf.parse(yourDateString); 
boolean result = yourZonedDateTime.compareTo(ta); 

这是一个开始的基础。你也可以看到这篇文章解释了如何将未知格式的字符串解析为日期。这可能会有所帮助。

Java 8 java.time package: parsing any string to date

1

请尝试这个为例,我希望它会帮助你....

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"); 
}