写管理 和展示页面的时候, 经常会涉及到列表页面(有财务喜欢称台账),有列表一般都有查询条件,查询条件一般都包括开始日期结束日期。比如你想查询2018-07-24日到 2018-07-25日 这两天的订单。
http请求的参数都是字符串,日期传到控制器层(Controller)会作为字符串处理,但是数据库层处理日期类型。 数据库处理的数据应该是 2018-07-24 00:00:00 ~ 2018-07-25 23:59:59秒。
这涉及到格式和类型两种转换。
两种方式:
第一种方式:拼接日期字符串方式
private Date getDayStart(String dateStr){
if(StringUtils.isEmpty(dateStr)){
return null;
}
SimpleDateFormat DEFAULT_SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return DEFAULT_SDF.parse(dateStr + " 00:00:00"); //某天的结束时间 + " 23:59:59"
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
我觉得不是很优雅,拼接固定结束字符串的时候,万一开头的空格没加上,导致解析日期不正确,还有处理解析异常,代码看起来很乱。
第二种方式: LocalDateTime(java8)
public static Date getDayStart(String dateStr){
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// LocalDateTime dateTime = LocalDateTime.parse(dateStr); 会报异常,因为LocalDateTime解析格式化字符串时,字符串需要包含时分秒
LocalDateTime dateTime = LocalDate.parse(dateStr, formatter).atTime(0, 0, 0); //时分秒
return Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
}
java8 之前处理日期,用Calendar写各种工具总觉得很虚。很多人建议用JodaTime。 java8中日期时间的处理,用LocalDateTime,更加优雅简洁,可读性更好。