在软件开发过程中,常常会面临各种涉及时间的情境,例如需要获取给定月份的上一个月等情况。因此,我总结了在开发中经常遇到的关于日期的问题,并将它们整合成了一个方便调用的Java工具类。如下:
1、获取传入日期的前五天,不考虑跨越
public static List<String> getDatesList(String pdate) {
List<String> datesList = new ArrayList<>();
List<LocalDate> previousFiveDays = new ArrayList<>();
LocalDate date2 = LocalDate.parse(pdate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
// 逐一计算前五天的日期
for (int i = 0; i < 5; i++) {
//判断是不是在一个月份,如果不是,则不添加,反正则添加
// if (date2.minusDays(i).getMonthValue() == date2.getMonthValue()) {
// previousFiveDays.add(date2.minusDays(i));
// }
previousFiveDays.add(date2.minusDays(i));
}
// 格式化日期为字符串
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
for (LocalDate date : previousFiveDays) {
String day = date.format(formatter);
datesList.add(day);
}
return datesList;
}
2、根据传入的开始日期、结束日期查询该范围内的全部日期
public static List<String> getRangeDateList(String sdate,String edate){
LocalDate startDate = LocalDate.parse(sdate);
LocalDate endDate = LocalDate.parse(edate);
List<LocalDate> dateList = new ArrayList<>();
List<String> rangeList = new ArrayList<>();
LocalDate currentDate = startDate;
while (!currentDate.isAfter(endDate)) {
dateList.add(currentDate);
currentDate = currentDate.plus(Period.ofDays(1));
}
//格式转换
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
for (LocalDate date : dateList) {
String day = date.format(formatter);
rangeList.add(day);
}
return rangeList;
}
3、根据月份获取该月的全部日期信息
public static List<String> getMonthDates(String pdate){
List<String> dateList = new ArrayList<>();
List<Date> dates = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = sdf.parse(pdate);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_MONTH, 1);
int month = calendar.get(Calendar.MONTH);
while (calendar.get(Calendar.MONTH) == month) {
dates.add(calendar.getTime());
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
} catch (ParseException e) {
// e.printStackTrace();
log.info("Error", e);
}
for (Date date1 : dates) {
dateList.add(sdf.format(date1));
}
return dateList;
}
4、获取传入月份的开始日期和结束日期
public static List<String> getBEDateOfMonth(String month){
List<String> dateList = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = sdf.parse(month);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
// 获取给定日期所在月份的开始时间
calendar.set(Calendar.DAY_OF_MONTH, 1);
Date monthStartDate = calendar.getTime();
// 获取给定日期所在月份的结束时间
calendar.add(Calendar.MONTH, 1);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.add(Calendar.DAY_OF_MONTH, -1);
Date monthEndDate = calendar.getTime();
String startDate = sdf.format(monthStartDate);
String endDate = sdf.format(monthEndDate);
dateList.add(startDate);
dateList.add(endDate);
} catch (ParseException e) {
// e.printStackTrace();
log.info("Error", e);
}
return dateList;
}
5、获取传入月份的上一个月
public static String getLastMonth(String month) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = format.parse(month);
Calendar calendar = Calendar.getInstance();
// 设置为当前时间
calendar.setTime(date);
calendar.add(Calendar.MONTH,-1);
// 设置为上一个月
//calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1);
date = calendar.getTime();
} catch (ParseException e) {
// e.printStackTrace();
log.info("Error", e);
}
return format.format(date);
}
6、获取月份范围的起止日期
public static List<String> getStartStopTime(String startMonth, String endMonth) {
List<String> list = new ArrayList<>();
//开始时间
startMonth = startMonth.substring(0,7) + "-01";
//结束时间
// 将字符串转换为 LocalDate 对象
LocalDate date = LocalDate.parse(endMonth, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
// 获取该月的最后一天
endMonth = date.withDayOfMonth(date.lengthOfMonth()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
list.add(startMonth);
list.add(endMonth);
return list;
}
7、获取传入月份范围的全部月份的起止时间
public static Map<String,List<String>> getMonthStartEnd(String start, String end){
Map<String,List<String>> map = new HashMap<>();
List<String> startMonthList = new ArrayList<>();
List<String> endMonthList = new ArrayList<>();
// 将字符串转换为 LocalDate 对象
LocalDate startMonth = LocalDate.parse(start, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
LocalDate endMonth = LocalDate.parse(end, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
// 遍历月份范围并输出每个月的开始和结束时间
LocalDate currentMonth = startMonth;
while (!currentMonth.isAfter(endMonth)) {
String firstDayOfMonth = currentMonth.withDayOfMonth(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
String lastDayOfMonth = currentMonth.withDayOfMonth(currentMonth.lengthOfMonth()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
startMonthList.add(firstDayOfMonth);
endMonthList.add(lastDayOfMonth);
// 下一个月
currentMonth = currentMonth.plusMonths(1);
}
map.put("start",startMonthList);
map.put("end",endMonthList);
return map;
}
8、获取月份的天数
public static int getDaysNumByYearMonth(String date) {
int year = Integer.parseInt(date.substring(0, 4));
int month = Integer.parseInt(date.substring(5, 7));
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month - 1);
calendar.set(Calendar.DATE, 1);
calendar.roll(Calendar.DATE, -1);
return calendar.get(Calendar.DATE);
}
=======================2024-05-15更新============================
详情:日期工具类(二)
后续会继续更新。 完整代码如下:
/**
* 日期获取工具类
*/
@Slf4j
public class DateUtils {
//根据传入日期查询该日期前五天内全部日期,不考虑跨月情况
public static List<String> getDatesList(String pdate) {
List<String> datesList = new ArrayList<>();
List<LocalDate> previousFiveDays = new ArrayList<>();
LocalDate date2 = LocalDate.parse(pdate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
// 逐一计算前五天的日期
for (int i = 0; i < 5; i++) {
//判断是不是在一个月份,如果不是,则不添加,反正则添加
// if (date2.minusDays(i).getMonthValue() == date2.getMonthValue()) {
// previousFiveDays.add(date2.minusDays(i));
// }
previousFiveDays.add(date2.minusDays(i));
}
// 格式化日期为字符串
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
for (LocalDate date : previousFiveDays) {
String day = date.format(formatter);
datesList.add(day);
}
return datesList;
}
//根据传入的开始时间、结束时间查询该范围内的全部时间
public static List<String> getRangeDateList(String sdate,String edate){
LocalDate startDate = LocalDate.parse(sdate);
LocalDate endDate = LocalDate.parse(edate);
List<LocalDate> dateList = new ArrayList<>();
List<String> rangeList = new ArrayList<>();
LocalDate currentDate = startDate;
while (!currentDate.isAfter(endDate)) {
dateList.add(currentDate);
currentDate = currentDate.plus(Period.ofDays(1));
}
//格式转换
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
for (LocalDate date : dateList) {
String day = date.format(formatter);
rangeList.add(day);
}
return rangeList;
}
//根据月份获取该月的全部日期信息
public static List<String> getMonthDates(String pdate){
List<String> dateList = new ArrayList<>();
List<Date> dates = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = sdf.parse(pdate);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_MONTH, 1);
int month = calendar.get(Calendar.MONTH);
while (calendar.get(Calendar.MONTH) == month) {
dates.add(calendar.getTime());
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
} catch (ParseException e) {
log.info("Error", e);
}
for (Date date1 : dates) {
dateList.add(sdf.format(date1));
}
return dateList;
}
//获取传入月份的开始时间和结束时间
public static List<String> getBEDateOfMonth(String month){
List<String> dateList = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = sdf.parse(month);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
// 获取给定日期所在月份的开始时间
calendar.set(Calendar.DAY_OF_MONTH, 1);
Date monthStartDate = calendar.getTime();
// 获取给定日期所在月份的结束时间
calendar.add(Calendar.MONTH, 1);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.add(Calendar.DAY_OF_MONTH, -1);
Date monthEndDate = calendar.getTime();
String startDate = sdf.format(monthStartDate);
String endDate = sdf.format(monthEndDate);
dateList.add(startDate);
dateList.add(endDate);
} catch (ParseException e) {
log.info("Error", e);
}
return dateList;
}
//获取上一个月
public static String getLastMonth(String month) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = format.parse(month);
Calendar calendar = Calendar.getInstance();
// 设置为当前时间
calendar.setTime(date);
calendar.add(Calendar.MONTH,-1);
// 设置为上一个月
//calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1);
date = calendar.getTime();
} catch (ParseException e) {
log.info("Error", e);
}
return format.format(date);
}
//获取起止时间
public static List<String> getStartStopTime(String startMonth, String endMonth) {
List<String> list = new ArrayList<>();
//开始时间
startMonth = startMonth.substring(0,7) + "-01";
//结束时间
// 将字符串转换为 LocalDate 对象
LocalDate date = LocalDate.parse(endMonth, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
// 获取该月的最后一天
endMonth = date.withDayOfMonth(date.lengthOfMonth()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
list.add(startMonth);
list.add(endMonth);
return list;
}
//获取传入月份范围的全部月份的起止时间
public static Map<String,List<String>> getMonthStartEnd(String start, String end){
Map<String,List<String>> map = new HashMap<>();
List<String> startMonthList = new ArrayList<>();
List<String> endMonthList = new ArrayList<>();
// 将字符串转换为 LocalDate 对象
LocalDate startMonth = LocalDate.parse(start, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
LocalDate endMonth = LocalDate.parse(end, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
// 遍历月份范围并输出每个月的开始和结束时间
LocalDate currentMonth = startMonth;
while (!currentMonth.isAfter(endMonth)) {
String firstDayOfMonth = currentMonth.withDayOfMonth(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
String lastDayOfMonth = currentMonth.withDayOfMonth(currentMonth.lengthOfMonth()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
startMonthList.add(firstDayOfMonth);
endMonthList.add(lastDayOfMonth);
// 下一个月
currentMonth = currentMonth.plusMonths(1);
}
map.put("start",startMonthList);
map.put("end",endMonthList);
return map;
}
//获取月份的天数
public static int getDaysNumByYearMonth(String date) {
int year = Integer.parseInt(date.substring(0, 4));
int month = Integer.parseInt(date.substring(5, 7));
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month - 1);
calendar.set(Calendar.DATE, 1);
calendar.roll(Calendar.DATE, -1);
return calendar.get(Calendar.DATE);
}
}