package Test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* TODO
*
* @author biao
* @date 2022-09-14
*/
public class Demo获取时间 {
public static void main(String[] args) throws Exception {
// String time = "2022-09-07";
// SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
// Date date = sdf.parse(time);
//日
System.out.println("下面是日时间");
System.out.println(pastDay("2022-9-11"));
//周
System.out.println("下面是周时间");
// System.out.println(getShangzhouTime(date,3));
System.out.println(getManShangZhouTime("2022-9-18", 5));
// System.out.println("=========");
//月
System.out.println("下面是月时间");
System.out.println(getManShangYueTime("2022-9-11", 12).toString());
// System.out.println("=========");
//季
System.out.println("下面是季度时间");
System.out.println(testQuarter("2022-9-11", 4));
//年
System.out.println("下面是年时间");
System.out.println(testYear("2022-9-11", 5));
}
//测试年份
public static String testYear(String time, int count) {
ArrayList<Map<String, Object>> pastDaysList = new ArrayList<>();
//我这里传来的时间是个string类型的,所以要先转为date类型的。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sdf.parse(time);
for (int i = count; i > 0; i--) {
pastDaysList.add(getLastYear(date, i));
}
} catch (ParseException e) {
e.printStackTrace();
}
return pastDaysList.toString();
}
/**
* 获取上一年年份
*
* @return
*/
public static Map<String, Object> getLastYear(Date date, int count) {
SimpleDateFormat formats = new SimpleDateFormat("yyyy");
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.YEAR, -count);
Date time = c.getTime();
// Date类型转String类型
String format = formats.format(time);
Map<String, Object> timeMap = new HashMap<>();
timeMap.put("startTime", format + "-01-01 00:00:00");
timeMap.put("endTime", format + "-12-31 24:00:00");
return timeMap;
}
//季度测试
public static String testQuarter(String time, int count) {
ArrayList<Map<String, Object>> pastDaysList = new ArrayList<>();
//我这里传来的时间是个string类型的,所以要先转为date类型的。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sdf.parse(time);
for (int i = count; i > 0; i--) {
pastDaysList.add(getLastQuarter(date, i));
}
} catch (ParseException e) {
e.printStackTrace();
}
return pastDaysList.toString();
}
/**
* 前多少个季度
*
* @param date
* @param count
* @return
*/
public static Map<String, Object> getLastQuarter(Date date, int count) {
Calendar startCalendar = Calendar.getInstance();
startCalendar.setTime(date);
startCalendar.set(Calendar.MONTH, ((int) startCalendar.get(Calendar.MONTH) / 3 - 1) * 3 - (count * 3) + 3);
startCalendar.set(Calendar.DAY_OF_MONTH, 1);
setMinTime(startCalendar);
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(date);
endCalendar.set(Calendar.MONTH, ((int) endCalendar.get(Calendar.MONTH) / 3 - 1) * 3 + 2 - (count * 3) + 3);
endCalendar.set(Calendar.DAY_OF_MONTH, endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH));
setMaxTime(endCalendar);
Map<String, Object> timeMap = new HashMap<>();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String start = formatter.format(startCalendar.getTime());
String end = formatter.format(endCalendar.getTime());
timeMap.put("startTime", start + " 00:00:00");
timeMap.put("endTime", end + " 24:00:00");
return timeMap;
}
/**
* 季度最小时间
*
* @param calendar
*/
private static void setMinTime(Calendar calendar) {
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
}
/**
* 季度最大时间
*
* @param calendar
*/
private static void setMaxTime(Calendar calendar) {
calendar.set(Calendar.HOUR_OF_DAY, calendar.getActualMaximum(Calendar.HOUR_OF_DAY));
calendar.set(Calendar.MINUTE, calendar.getActualMaximum(Calendar.MINUTE));
calendar.set(Calendar.SECOND, calendar.getActualMaximum(Calendar.SECOND));
calendar.set(Calendar.MILLISECOND, calendar.getActualMaximum(Calendar.MILLISECOND));
}
//测试周报
public static String getManShangZhouTime(String time, int count) {
ArrayList<String> pastDaysList = new ArrayList<>();
//我这里传来的时间是个string类型的,所以要先转为date类型的。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sdf.parse(time);
for (int i = count; i > 0; i--) {
String daytime = getShangzhouTime(date, i);
pastDaysList.add(daytime);
}
} catch (ParseException e) {
e.printStackTrace();
}
return pastDaysList.toString();
}
//周报
public static String getShangzhouTime(Date date, int count) {
Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();
calendar1.setTime(date);
calendar2.setTime(date);
int dayOfWeek = calendar1.get(Calendar.DAY_OF_WEEK) - 1;
int offset1 = 1 - dayOfWeek;
int offset2 = 7 - dayOfWeek;
if (dayOfWeek != 0) {
calendar1.add(Calendar.DATE, offset1 - (7 * count));
calendar2.add(Calendar.DATE, offset2 - (7 * count));
} else {
calendar1.add(Calendar.DATE, offset1 - (7 * count) - 7);
calendar2.add(Calendar.DATE, offset2 - (7 * count) - 7);
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String lastBeginDate = sdf.format(calendar1.getTime());
String lastEndDate = sdf.format(calendar2.getTime());
return lastBeginDate + "至" + lastEndDate;
}
//测试月报
public static String getManShangYueTime(String time, int count) {
ArrayList<Map<String, Object>> pastDaysList = new ArrayList<>();
Map<String, Object> timeMap = new HashMap<>();
//我这里传来的时间是个string类型的,所以要先转为date类型的。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sdf.parse(time);
for (int i = count; i > 0; i--) {
timeMap = getShangyueTime(date, i);
pastDaysList.add(timeMap);
}
} catch (ParseException e) {
e.printStackTrace();
}
return pastDaysList.toString();
}
//月报
public static Map<String, Object> getShangyueTime(Date date, int count) {
Map<String, Object> map = new HashMap<>();
Calendar cale = Calendar.getInstance();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
cale.setTime(date);
cale.add(Calendar.MONTH, -(count));
cale.set(Calendar.DAY_OF_MONTH, 1);
// 当月第一天 2019-02-01
String firstDayOfMonth = formatter.format(cale.getTime());
cale.add(Calendar.MONTH, 1);
cale.set(Calendar.DAY_OF_MONTH, 0);
// 当月最后一天 2019-02-28
String lastDayOfMonth = formatter.format(cale.getTime());
map.put("startTime", firstDayOfMonth + " 00:00:00");
map.put("endTime", lastDayOfMonth + " 24:00:00");
return map;
}
//
/**
* 获取过去第几天的日期
*
* @param past
* @return
*/
public static String getPastDate(int past, Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) - past);
Date today = calendar.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String result = sdf.format(today);
return result;
}
/**
* 获取过去7天内的日期数组
*
* @return 日期数组
*/
public static ArrayList<String> pastDay(String time) {
ArrayList<String> pastDaysList = new ArrayList<>();
try {
//我这里传来的时间是个string类型的,所以要先转为date类型的。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(time);
for (int i = 7; i >= 1; i--) {
pastDaysList.add(getPastDate(i, date));
}
} catch (ParseException e) {
e.printStackTrace();
}
return pastDaysList;
}
}
测试结果
可以指定某个时间 的前多少日,周,月,季,年
下面是日时间
[2022-06-26, 2022-06-27, 2022-06-28, 2022-06-29, 2022-06-30, 2022-07-01, 2022-07-02]
下面是周时间
[2022-08-08至2022-08-14, 2022-08-15至2022-08-21, 2022-08-22至2022-08-28, 2022-08-29至2022-09-04, 2022-09-05至2022-09-11, 2022-09-12至2022-09-18]
下面是月时间
[{startTime=2021-09-01 00:00:00, endTime=2021-09-30 24:00:00}, {startTime=2021-10-01 00:00:00, endTime=2021-10-31 24:00:00}, {startTime=2021-11-01 00:00:00, endTime=2021-11-30 24:00:00}, {startTime=2021-12-01 00:00:00, endTime=2021-12-31 24:00:00}, {startTime=2022-01-01 00:00:00, endTime=2022-01-31 24:00:00}, {startTime=2022-02-01 00:00:00, endTime=2022-02-28 24:00:00}, {startTime=2022-03-01 00:00:00, endTime=2022-03-31 24:00:00}, {startTime=2022-04-01 00:00:00, endTime=2022-04-30 24:00:00}, {startTime=2022-05-01 00:00:00, endTime=2022-05-31 24:00:00}, {startTime=2022-06-01 00:00:00, endTime=2022-06-30 24:00:00}, {startTime=2022-07-01 00:00:00, endTime=2022-07-31 24:00:00}, {startTime=2022-08-01 00:00:00, endTime=2022-08-31 24:00:00}]
下面是季度时间
[{startTime=2021-07-01 00:00:00, endTime=2021-09-30 24:00:00}, {startTime=2021-10-01 00:00:00, endTime=2021-12-31 24:00:00}, {startTime=2022-01-01 00:00:00, endTime=2022-03-31 24:00:00}, {startTime=2022-04-01 00:00:00, endTime=2022-06-30 24:00:00}]
下面是年时间
[{startTime=2017-01-01 00:00:00, endTime=2017-12-31 24:00:00}, {startTime=2018-01-01 00:00:00, endTime=2018-12-31 24:00:00}, {startTime=2019-01-01 00:00:00, endTime=2019-12-31 24:00:00}, {startTime=2020-01-01 00:00:00, endTime=2020-12-31 24:00:00}, {startTime=2021-01-01 00:00:00, endTime=2021-12-31 24:00:00}]