情况:有一个Object AuditLog ,其中包含变量java.util.Date date。此对象保存在mySQL数据库中。
@Entity
public class AuditLog implements Persistable<Long> {
...
@Temporal(TemporalType.DATE)
private Date date;
...
}
我正在编写一些JUnit测试,需要验证保存的日期是否等于实际日期。其中date
是在保存然后再次加载之前实际传递给log
对象的值的本地副本。
Assert.assertEquals(date, log.getDate());
Output:
expected:<Wed May 24 15:54:40 CEST 2017> but was:<2017-05-24>
所以你可以看到日期实际上是正确的,但只有 y-m-d 然后我尝试了这个(下面)来检查毫秒是否会被改变。
Assert.assertEquals(date.getTime(), log.getDate().getTime());
Output:
expected:<1495634973799> but was:<1495576800000>
现在我认为最好的方法是只获得年 月 天的毫秒数。
问题:这可以实现相对简单吗?我应该这样做吗?我认为日期因某种数据库操作而被改变,所以适应测试是对的吗?
答案 0 :(得分:2)
有两种方法可以做到这一点:
使用本地日期:您可以将util eb deploy my_env > deploy_results.txt
grep 'update completed successfully' deploy_results.txt
转换为Date
,并在两个对象上执行LocalDate
。 assertEquals
没有时间,例如:
LocalDate
使用Apache commons&#39; DateUtils:您可以使用Date input = new Date();
LocalDate date = input.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
System.out.println(date);
方法将非日期字段设置为零,例如:
truncate
Here's Apache commons库的maven依赖。
答案 1 :(得分:1)
Calendar cal = GregorianCalendar.getInstance();
cal.set(Calendar.YEAR, 2017);
cal.set(Calendar.MONTH, 5 - 1);
cal.set(Calendar.DAY_OF_MONTH, 24);
cal.set(Calendar.MILLISECOND, 0);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
Date d = cal.getTime();
System.out.println(d.getTime());
此代码创建一个仅设置年,月和日的新java.util.Date。这个例子的结果是1495576800000
,这就是你想要的。
更短的方式是:
Date d = new Date(0l);
d.setYear(117);
d.setMonth(4);
d.setDate(24);
d.setHours(0);
答案 2 :(得分:1)
您可以使用以下代码获取“日,月,年”:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
public class Answer {
public static void main(String args[]) throws ParseException {
// parse the date and time
String input = "Wed May 24 15:54:40 CEST 2017";
SimpleDateFormat parser = new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");
Date date = parser.parse(input);
// parse just the date
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
formatter.setTimeZone(TimeZone.getTimeZone("CEST"));
String formattedDate = formatter.format(date);
Date parsedDate = formatter.parse(formattedDate);
System.out.println(parsedDate);
// use https://currentmillis.com/ to check the milliseconds figures
System.out.println("Wed May 24 15:54:40 CEST 2017 in milliseconds \t" + date.getTime());
System.out.println("Wed May 24 00:00:00 CEST 2017 in milliseconds \t" + parsedDate.getTime());
}
}
第二个SimpleDateFormat(“yyyy-MM-dd”);解析年月日。
使用Date.getTime());得到毫秒。
输出结果为:
Wed May 24 15:54:40 CEST 2017 in milliseconds 1495634080000
Wed May 24 00:00:00 CEST 2017 in milliseconds 1495584000000
1495584000000 = 2017年5月24日星期三00:00:00(使用https://currentmillis.com/)
答案 3 :(得分:0)
您应格式化两个日期:
Date date = new Date();
SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
dt.format(date);
然后相互比较。