1.出现背景
这个需求的出现是在项目开发过程中,进行活动时间设置。需要把活动开始当天的第一秒和活动结束当天是最后一秒,作为一个完整的活动时间。而当时前端传输过来的日期格式是 年-月-日(可选择),时分秒默认当时创建的时间。这是就需要对时分秒进行格式转换。
2.解决方案
2.1 SimpleDateFormat方案
这是一般对日期进行格式化的方法,可以自定义日期格式,但确实比较low,转换也比较麻烦,但可以满足需要。
public static void main(String[] args) throws ParseException {
Date date = new Date();
tranformTime(date);
}
private static void tranformTime(Date date) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("原始时间:"+date);
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd 00:00:01");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd 23:59:59");
String startTimeStr = sdf1.format(date);
String endTimeStr = sdf2.format(date);
Date startTime = sdf.parse(startTimeStr);
Date EndTime = sdf.parse(endTimeStr);
System.out.println("开始时间:"+startTime);
System.out.println("结束时间:"+EndTime);
}
2.2 Calendar方式
Calendar类是一个抽象类,可以为在某一特定时刻和一组之间的转换的方法calendar fields如YEAR , MONTH , DAY_OF_MONTH , HOUR ,等等,以及用于操纵该日历字段,如获取的日期下个星期。 时间上的瞬间可以用毫秒值表示,该值是从1970年1月1日00:00 00:00.000 GMT(Gregorian)的Epoch的偏移量。 该类还提供了用于在包外部实现具体日历系统的其他字段和方法。 这些字段和方法定义为protected 。 (来自API)
public static void main(String[] args) throws ParseException {
Date date = new Date();
System.out.println("原始时间:"+date);
System.out.println("开始时间:"+getDateMin(date));
System.out.println("结束时间:"+getDateMaxDB(date));
}
public static Date getDateMin(Date date) {
if(date==null) {
return date;
}
Calendar c = Calendar.getInstance();
c.setTime(date);
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 1);
c.set(Calendar.MILLISECOND, 0);
return c.getTime();
}
/**
* 获取某天的最大时间
* @param date
* @return
*/
public static Date getDateMaxDB(Date date) {
if(date==null) {
return date;
}
Calendar c = Calendar.getInstance();
c.setTime(date);
c.set(Calendar.HOUR_OF_DAY, 23);
c.set(Calendar.MINUTE, 59);
c.set(Calendar.SECOND, 59);
c.set(Calendar.MILLISECOND, 0);
return c.getTime();
}
注意:当需要把处理好的日期插入到数据库时,需要把c.set(Calendar.MILLISECOND, 0);毫秒值设置为0或500以下,因为mysql在进行处理的时候会把大于500毫秒的数据自动加1。