在实际工作中会遇到很多统计分析之类的场景,大多会用到按照时间维度来统计和分析数据;
这里分享一个Java工具类,直接看代码。
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* 获取两个日期之间的所有日期工具类
*
* @Author 孙龙
* @Date 2018/8/13
*/
public class DateTimeSectionUtil {
/**
* 获取两个日期之间的所有日期(字符串格式, 按天计算)
*
* @param start
* @param end
* @return
*/
public static List<String> getBetweenDays(Date start, Date end) {
List<String> result = new ArrayList<String>();
Calendar tempStart = Calendar.getInstance();
tempStart.setTime(start);
tempStart.add(Calendar.DAY_OF_YEAR, 1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar tempEnd = Calendar.getInstance();
tempEnd.setTime(end);
result.add(sdf.format(start));
while (tempStart.before(tempEnd)) {
result.add(sdf.format(tempStart.getTime()));
tempStart.add(Calendar.DAY_OF_YEAR, 1);
}
return result;
}
/**
* 获取两个日期之间的所有小时(字符串格式, 按小时计算)
*
* @param start
* @param end
* @return
*/
public static List<String> getBetweenHours(Date start, Date end) {
List<String> result = new ArrayList<String>();
Calendar tempStart = Calendar.getInstance();
tempStart.setTime(start);
tempStart.add(Calendar.HOUR_OF_DAY, 1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:00");
Calendar tempEnd = Calendar.getInstance();
tempEnd.setTime(end);
result.add(sdf.format(start));
while (tempStart.before(tempEnd)) {
result.add(sdf.format(tempStart.getTime()));
tempStart.add(Calendar.HOUR_OF_DAY, 1);
}
return result;
}
/**
* 获取两个日期之间的所有分钟(字符串格式, 按分钟计算)
*
* @param start
* @param end
* @return
*/
public static List<String> getBetweenMinutes(Date start, Date end) {
List<String> result = new ArrayList<String>();
Calendar tempStart = Calendar.getInstance();
tempStart.setTime(start);
tempStart.add(Calendar.MINUTE, 1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Calendar tempEnd = Calendar.getInstance();
tempEnd.setTime(end);
result.add(sdf.format(start));
while (tempStart.before(tempEnd)) {
result.add(sdf.format(tempStart.getTime()));
tempStart.add(Calendar.MINUTE, 1);
}
return result;
}
/**
* 获取两个日期之间的所有周(字符串格式, 按周计算, 显示本年第几周)
*
* @param start
* @param end
* @return
*/
public static List<String> getBetweenWeekOfYear(Date start, Date end) {
List<String> result = new ArrayList<String>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-ww");
Calendar tempStart = Calendar.getInstance();
tempStart.setTime(start);
tempStart.setFirstDayOfWeek(Calendar.MONDAY);//设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
System.out.println(tempStart.get(Calendar.WEEK_OF_YEAR));
tempStart.add(Calendar.WEEK_OF_YEAR, 0);
Calendar tempEnd = Calendar.getInstance();
tempEnd.setTime(end);
tempEnd.setFirstDayOfWeek(Calendar.MONDAY);
System.out.println(tempEnd.get(Calendar.WEEK_OF_YEAR));
while (tempStart.before(tempEnd)) {
result.add(sdf.format(tempStart.getTime()));
tempStart.add(Calendar.WEEK_OF_YEAR, 1);
}
return result;
}
/**
* 获取两个日期之间的所有周(字符串格式, 按周计算, 显示周一)
*
* @param start
* @param end
* @return
*/
public static List<String> getBetweenWeeks(Date start, Date end) {
List<String> result = new ArrayList<String>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar tempStart = Calendar.getInstance();
tempStart.setTime(start);
tempStart.setFirstDayOfWeek(Calendar.MONDAY);//设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
int day = tempStart.get(Calendar.DAY_OF_WEEK);//获得当前日期是一个星期的第几天
tempStart.add(Calendar.DATE, tempStart.getFirstDayOfWeek() - day);//根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
String firstDayOfWeek = sdf.format(tempStart.getTime()); //周一时间
tempStart.add(Calendar.WEEK_OF_YEAR, 1);
Calendar tempEnd = Calendar.getInstance();
tempEnd.setTime(end);
result.add(firstDayOfWeek);
while (tempStart.before(tempEnd)) {
result.add(sdf.format(tempStart.getTime()));
tempStart.add(Calendar.WEEK_OF_YEAR, 1);
}
return result;
}
/**
* 获取两个日期之间的所有月(字符串格式, 按月计算)
*
* @param start
* @param end
* @return
*/
public static List<String> getBetweenMonths(Date start, Date end) {
List<String> result = new ArrayList<String>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
Calendar tempStart = Calendar.getInstance();
tempStart.setTime(start);
tempStart.add(Calendar.MONTH, 1);
Calendar tempEnd = Calendar.getInstance();
tempEnd.setTime(end);
result.add(sdf.format(start));
while (tempStart.before(tempEnd)) {
result.add(sdf.format(tempStart.getTime()));
tempStart.add(Calendar.MONTH, 1);
}
return result;
}
/**
* 获取当前月的第一天
*
* @param date
* @return
*/
public static String getFirstDayOfMonth(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar dateTemp = Calendar.getInstance();//获取当前日期
dateTemp.setTime(date);
dateTemp.add(Calendar.MONTH, 0);
dateTemp.set(Calendar.DAY_OF_MONTH, 1);//设置为1号,当前日期既为本月第一天
return sdf.format(dateTemp.getTime());
}
/**
* 获取当前月的最后一天
*
* @param date
* @return
*/
public static String getLastDayOfMonth(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar dateTemp = Calendar.getInstance();//获取当前日期
dateTemp.setTime(date);
dateTemp.set(Calendar.DAY_OF_MONTH, dateTemp.getActualMaximum(Calendar.DAY_OF_MONTH));
return sdf.format(dateTemp.getTime());
}
/**
* 获取当前周的第一天(以周一为周的开始日)
*
* @param date
* @return
*/
public static String getFirstDayOfWeek(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar dateTemp = Calendar.getInstance();//获取当前日期
dateTemp.setTime(date);
int d = 0;
if (dateTemp.get(Calendar.DAY_OF_WEEK) == 1) {
d = -6;
} else {
d = 2 - dateTemp.get(Calendar.DAY_OF_WEEK);
}
dateTemp.add(Calendar.DAY_OF_WEEK, d);
return sdf.format(dateTemp.getTime());
}
/**
* 获取当前周的最后一天(以周一为周的开始日)
*
* @param date
* @return
*/
public static String getLastDayOfWeek(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar dateTemp = Calendar.getInstance();//获取当前日期
//dateTemp.setFirstDayOfWeek(Calendar.MONDAY);//设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
dateTemp.setTime(date);
int d = 0;
if (dateTemp.get(Calendar.DAY_OF_WEEK) != 1) {
d = 8 - dateTemp.get(Calendar.DAY_OF_WEEK);
}
dateTemp.add(Calendar.DAY_OF_WEEK, d);
return sdf.format(dateTemp.getTime());
}
}
希望能帮到你,如果帮到你请给我一个喜欢!