日常工作中,我们会经常用做日期的格式化、日期与字符串之间的转换、日期之间的计算等。为了聚焦项目本身而不要过分关注其他细枝末节,本人写了一个开发中可能会用到的日期工具类。这个工具类里主要包含有“将日期字符串转换为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());
}*/
}