今天在调试一个功能时出现一个问题,有一个调Dao返回泛型List的简单代码,传入两个查询参数,分别为String和Date类型。
在生产环境传入时间等参数查询时总是查不到数据,实际上表中是有数据的,将语句加上查询条件捞出来放到数据库是能查出来数据的。
后来才发现是因为代码中传的date类型参数只精确到秒,毫秒级别不是零导致查询匹配不上,所以在用date类型进行比较时一定要记得毫秒位,或者就用时间戳格式进行比较,或者限制一个精确到毫秒的范围,比如date>=2017-08-04 00:00:00:000 and date<=2017-08-04 23:59:59:999。
测试代码如下:
可以发现,毫秒未置零之前根据当前时间获取的calendar实例和字符串转换出的date对象时间戳是不同的。
public static void main(String[] args)
{
//当前时间的Calendar实例
Calendar calendar=Calendar.getInstance();
Date date=new Date();
//将小时置零
calendar.set(Calendar.HOUR_OF_DAY, 0);
//将分钟置零
calendar.set(Calendar.MINUTE,0);
//将秒置零
calendar.set(Calendar.SECOND, 0);
//获取转化为毫秒值
System.out.println(calendar.getTimeInMillis());//1502121600093
//转化为date类型
date=calendar.getTime();
//打印date值的时间戳值
System.out.println(date.getTime());//1502121600093
//格式化
SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf1.format(date));//2017-08-08 00:00:00
System.out.println();
String str="2017-08-08 00:00:00";
try
{
//将字符串转化为时间,字符串时间格式一定要和SimpleDateFormat构造的对象格式相同,否则会报错
date=sdf1.parse(str);
System.out.println(date.getTime());//1502121600000
}
catch (ParseException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
calendar.set(Calendar.MILLISECOND,0);
System.out.println(calendar.getTimeInMillis());//1502121600000
}