Java处理时间相关工作总结
最近工作中使用到了一些关于处理统计时间的相关方法,在这里各位小伙伴分享一下
/**
* 获取时间节点内天数日期或月份日期集合
*
* @param time 起始具体日期 格式:yyyy-MM-dd得到的为某几天的日期集合 yyyy-MM得到的为某几个月的日期集合
* @param selectNumberDays 需要向前查询的天数或月数
* @return 时间节点内天数日期或月份日期集合
*/
public List<String> pastDayOrMouths(String time,Integer selectNumberDays){
List<String> pastDaysList = new ArrayList<>();
try {
String formatType = "yyyy-MM-dd";
if(time.length() == 7){
formatType = "yyyy-MM";
}
SimpleDateFormat sdf = new SimpleDateFormat(formatType);
Date date = sdf.parse(time);
for (int i = selectNumberDays - 1; i >= 0; i--) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
if(time.length() == 7){
calendar.add(Calendar.MONTH, - i);
}else{
calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) - i);
}
Date todayOrMouth = calendar.getTime();
String result = sdf.format(todayOrMouth);
String oneDayOrOneMouth = "";
if(time.length() == 7){
oneDayOrOneMouth = getSomeMouthStarDayAndEndDay(result);
}else{
oneDayOrOneMouth = result + " 00:00:00" + "&&" + result + " 23:59:59";
}
pastDaysList.add(oneDayOrOneMouth);
}
} catch (ParseException e) {
e.printStackTrace();
throw new ServiceException("获取时间范围内日期集合失败!");
}
return pastDaysList;
}
/**
*
* 获取当前月指定个数的前几个月日期
* @param monthDate 指定月份 格式:yyyy-MM
* @param offset 指定前几个月,例如前一个月 offset==1,前两个月offset==2
* @return
*/
public static String getMonths(String monthDate,int offset) {
String format = "";
try{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
Date date = sdf.parse(monthDate);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MONTH, -offset);
Date m = calendar.getTime();
format = sdf.format(m);
}catch (Exception e){
e.printStackTrace();
}
return format;
}
/**
* 获取时间范围某几个月日期集合
*
* @param minDate 起始月份 格式:yyyy-MM
* @param maxDate 截至月份 格式:yyyy-MM
*/
private List<String> getMonthBetween(String minDate, String maxDate){
List<String> result = new ArrayList<>();
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");//格式化为年月
Calendar min = Calendar.getInstance();
Calendar max = Calendar.getInstance();
min.setTime(sdf.parse(minDate));
min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);
max.setTime(sdf.parse(maxDate));
max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2);
Calendar curr = min;
while (curr.before(max)) {
String mouth = sdf.format(curr.getTime());
// 转换格式
String someMouthStarDayAndEndDay = getSomeMouthStarDayAndEndDay(mouth);
result.add(someMouthStarDayAndEndDay);
curr.add(Calendar.MONTH, 1);
}
} catch (ParseException e) {
e.printStackTrace();
}
return result;
}
/**
* 获取某年某个月的第一天和最后一天
* @param monuth 格式 yyyy-MM
*/
public String getSomeMouthStarDayAndEndDay(String monuth){
String ret = "";
try {
// 格式化传入时间
Date parse = new SimpleDateFormat("yyyy-MM").parse(monuth);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
// 设置时间
calendar.setTime(parse);
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
String firstDate = sdf.format(calendar.getTime());
ret = firstDate + " 00:00:00" + "&&";
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
String lastDate = sdf.format(calendar.getTime());
ret += lastDate + " 23:59:59";
} catch (Exception e) {
e.printStackTrace();
}
return ret;
}