日常工作中,我们会经常用做日期的格式化、日期与字符串之间的转换、日期之间的计算等。为了聚焦项目本身而不要过分关注其他细枝末节,本人写了一个开发中可能会用到的日期工具类。这个工具类里主要包含有“将日期字符串转换为Date日期”、“将Date日期转换为字符串形式”、“获取日期区间段内的每日日期”、“两个日期的时间戳之差”等这几个方法。
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; public class DateTimeUtils { /** * 将日期字符串转换为日期对象 * * @param dateStr 日期字符串,如“2018-10-08” * @param dateFormate 日期格式化字符串,如“yyyy-MM-dd" * @return 日期对象 * @see [类、类#方法、类#成员] * @Description: TODO */ public static Date parseDate(String dateText, String dateFormate) { if(dateText==null|| dateText.trim().isEmpty()) return null; SimpleDateFormat sdf = new SimpleDateFormat(dateFormate); Date date = null; try { date = sdf.parse(dateText); } catch (ParseException e) { e.printStackTrace(); } return date; } /** * 获得某日期区间的每日日期集合 * * @param startDate 起始日期 * @param endDate 结束日期 * @return 日期集合 * @see [类、类#方法、类#成员] */ public static List<Date> getDatePeriodList(Date startDate, Date endDate) { List<Date> listDate = new ArrayList<Date>(); // 将起始日期加入日期列表 listDate.add(startDate); // 循环中会用到起止日期之间的日历对象 Calendar calCurrentDate = Calendar.getInstance(); // 将其初始值设置为起始日期 calCurrentDate.setTime(startDate); while (endDate.after(calCurrentDate.getTime())) { // 每次循环中,日历对象calCurrentDate向推进1天,并将其转换后的Date对象添加到listDate列表中 calCurrentDate.add(Calendar.DAY_OF_MONTH, 1); listDate.add(calCurrentDate.getTime()); } return listDate; } /** * 获得某日期区间的字符串型每日日期集合 * <br> * 如2018-10-01、2018-10-02、...2018-10-21 * * @param startDate 起始日期 * @param endDate 结束日期 * @param dateFormat 日期格式化字符串,如“yyyy-MM-dd" * @return 字符串型日期集合 * @see [类、类#方法、类#成员] * @Description: TODO */ public static List<String> datePeriodText(Date startDate, Date endDate, String dateFormat) { List<String> dateStrs = new ArrayList<>(); // 将起始日期加入日期列表 String startDateStr = dateToTextFormat(startDate, dateFormat); dateStrs.add(startDateStr); // 循环中会用到起止日期之间的日历对象 Calendar calCurrentDate = Calendar.getInstance(); // 将其初始值设置为起始日期 calCurrentDate.setTime(startDate); while (endDate.after(calCurrentDate.getTime())) { // 每次循环中,日历对象calCurrentDate向推进1天,并将其转换后的Date对象添加到listDate列表中 calCurrentDate.add(Calendar.DAY_OF_MONTH, 1); String curDateStr = dateToTextFormat(calCurrentDate.getTime(), dateFormat); dateStrs.add(curDateStr); } return dateStrs; } /** * 将日期对象转换为字符串形式 * * @param date 日期 * @param dateFormate 日期格式化字符串,如“yyyy-MM-dd" * @return 字符串格式的日期 * @see [类、类#方法、类#成员] * @Description: TODO */ public static String dateToTextFormat(Date date, String dateFormat) { return new SimpleDateFormat(dateFormat).format(date); } /** * 比较两个字符串格式的日期dateA 、dateB的先后时间顺序 * <p> * 返回值为1表示dateA时间在dateB之后, 返回值为-1表示dateA时间在dateB之前, 返回值为0表示dateA、dateB时间相同, * * @param dateA 日期1,如"08:10" * @param dateB 日期2,如"08:21" * @param dateFormate 日期格式化字符串 ,如"hh:mm"(12小时制)、“HH:mm"(24小时制) * @return 有-1,0,1这三个返回值 * @see [类、类#方法、类#成员] * @Description: TODO */ public static int compareTo(String dateA, String dateB, String dateFormate) { Date date1 = parseDate(dateA, dateFormate); Date date2 = parseDate(dateB, dateFormate); // date1在date2之后 if (date1.getTime() > date2.getTime()) { return 1; } // date1 在date2之前 else if (date1.getTime() < date2.getTime()) { return -1; } // date1 、date2时间相同 else { return 0; } } /** * 计算两个字符串格式的日期dateA 、dateB的时间戳之差 * * @param dateA 日期A,如"08:10" 、"2018-03-10 12:12" * @param dateB 日期B,如"08:21"、 "2018-03-15 14:12" * @param dateFormate 日期格式化字符串 ,如"hh:mm"(12小时制)、“HH:mm"(24小时制) 、 "yyyy-MM-dd HH:mm" * @return 两日期之差的毫秒数 * @see [类、类#方法、类#成员] */ public static long diff(String dateA,String dateB,String dateFormate){ Date date1 = parseDate(dateA, dateFormate); Date date2 = parseDate(dateB, dateFormate); return date1.getTime()-date2.getTime(); } /** * 计算两个日期相差的小时数 * @param newDate * @param oldDate * @return * @see [类、类#方法、类#成员] */ public static long calcTimeDiffOnHour(Date newDate ,Date oldDate){ if(newDate==null || oldDate ==null){ throw new IllegalArgumentException("参数 newDate 、oldDate不能为空"); } long diffMillis= newDate.getTime()-oldDate.getTime(); return diffMillis/(1000*60*60); } public static void main(String[] args) { long t=calcTimeDiffOnHour(new Date(),new Date(119,7,24)); System.out.println(t); System.out.println(new Date(119,7,24)+" "+new Date()); } }