Java 如何使用Ebean-in-Play框架比较日期?
Java 如何使用Ebean-in-Play框架比较日期?,java,orm,playframework,playframework-2.0,ebean,Java,Orm,Playframework,Playframework 2.0,Ebean,Scenario.java: package models; import java.util.*; import javax.persistence.*; import play.db.ebean.*; @Entity public class Scenario extends Model { @Id public Long id; public String name; public boolean isPublic; public bool
Scenario.java
:
package models;
import java.util.*;
import javax.persistence.*;
import play.db.ebean.*;
@Entity
public class Scenario extends Model {
@Id
public Long id;
public String name;
public boolean isPublic;
public boolean isAccepted;
public Date expirationDate;
@ManyToOne
public User owner;
@ManyToMany
public List<User> members = new ArrayList<User>();
@OneToMany(cascade = CascadeType.ALL)
public List<Checkpoint> checkpoints = new ArrayList<Checkpoint>();
public static Model.Finder<Long, Scenario> find =
new Finder<Long, Scenario>(Long.class, Scenario.class);
public Scenario(String name, boolean isPublic, Date expirationDate, User owner) {
this.name = name;
this.isPublic = isPublic;
this.expirationDate = expirationDate;
this.owner = owner;
this.isAccepted = false;
this.members.add(owner);
}
public static Scenario create(String name, boolean isPublic, Date expirationDate,
String owner) {
Scenario scenario = new Scenario(name, isPublic, expirationDate, User.find.ref(owner));
scenario.save();
scenario.saveManyToManyAssociations("members");
return scenario;
}
public static List<Scenario> findNotExpired(Date date) {
return find.where().or(
com.avaje.ebean.Expr.lt("expirationDate", date),
com.avaje.ebean.Expr.isNull("expirationDate")
).findList();
}
}
封装模型;
导入java.util.*;
导入javax.persistence.*;
导入play.db.ebean.*;
@实体
公共类场景扩展模型{
@身份证
公共长id;
公共字符串名称;
公共布尔值是公共的;
接受公共布尔值;
公开日期到期日期;
@许多酮
公共用户所有者;
@许多
public List members=new ArrayList();
@OneToMany(级联=级联类型.ALL)
公共列表检查点=新建ArrayList();
公共静态模型=
新查找器(Long.class、Scenario.class);
公共场景(字符串名称、布尔值isPublic、日期expirationDate、用户所有者){
this.name=名称;
this.isPublic=isPublic;
this.expirationDate=到期日期;
this.owner=所有者;
this.isAccepted=false;
此.members.add(所有者);
}
公共静态场景创建(字符串名称、布尔值isPublic、日期expirationDate、,
字符串所有者){
Scenario Scenario=新方案(名称、isPublic、过期日期、User.find.ref(所有者));
scenario.save();
情景。储蓄互助协会(“成员”);
返回场景;
}
公共静态列表findNotExpired(日期){
返回find.where()。或(
com.avaje.ebean.Expr.lt(“到期日”,日期),
com.avaje.ebean.Expr.isNull(“到期日”)
).findList();
}
}
测试:
@Test
public void findScenariosNotExpired() {
new User("bob@gmail.com", "Bob", "secret").save();
new User("jane@gmail.com", "Jane", "secret").save();
SimpleDateFormat dt = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
Scenario.create("Scenario 1", false, null, "bob@gmail.com");
try {
Scenario.create("Scenario 2", false, dt.parse("2013-12-12 00:00:00"), "jane@gmail.com");
Scenario.create("Scenario 3", false, dt.parse("2013-10-10 00:00:00"), "jane@gmail.com");
} catch (ParseException e) {
System.err.println("Problem with date parsing");
e.printStackTrace();
}
List<Scenario> results = Scenario.findNotExpired(new Date());
assertEquals(2, results.size());
}
@测试
公共无效查找ScenarioSnotespired(){
新用户(“bob@gmail.com“,”Bob“,”secret“).save();
新用户(“jane@gmail.com“,”简“,”秘密“).save();
SimpleDataFormat dt=新的SimpleDataFormat(“yyyy-mm-dd hh:mm:ss”);
Scenario.create(“Scenario 1”,false,null,”bob@gmail.com");
试一试{
场景创建(“场景2”,false,dt.parse(“2013-12-12 00:00:00”),”jane@gmail.com");
场景创建(“场景3”,false,dt.parse(“2013-10-10 00:00:00”),”jane@gmail.com");
}捕获(解析异常){
System.err.println(“日期解析问题”);
e、 printStackTrace();
}
列表结果=Scenario.findNotExpired(newdate());
assertEquals(2,results.size());
}
测试结果:
[error] Test models.ModelsTest.findScenariosNotExpired failed: expected:<2> but was:<3>
[错误]测试模型.ModelsTest.findScenariosNotExpired失败:应为:但为:
在测试中,我通过了newdate()
,因为它应该包括今天的日期(2013年10月13日)。这就是为什么我希望大小为2(一个为空,一个日期在今天之前)
我应该换什么?我想问题可能出在
com.avaje.ebean.Expr.lt(“expirationDate”,date)
-可以这样比较日期吗?您需要使用MM
而不是MM
使用
SimpleDateFormat dt = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
dt.parse("2013-12-12 00:00:00") evaluates to Sat Jan 12 00:00:00 EST 2013
dt.parse("2013-10-10 00:00:00") evaluates to Thu Jan 10 00:00:00 EST 2013
而是使用
SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
对于小时,请注意“h”给出了12小时格式。使用“HH”代替“HH”,以24小时格式获取小时数。参考: