按日,周,月,季,年统计;获取对应的时间段
按日,周,月,季,年统计;获取对应的时间段
1.周实体类:WeekEntity.java
package com.test.common.entity;import java.time.LocalDate;public class WeekEntity {private String day;/*** 开始日期**/private LocalDate startTime;/*** 结束日期**/private LocalDate endTime;/*** 开始日期数字化**/private Integer startTimeNumber;/*** 结束日期数字化**/private Integer endTimeNumber;/*** XXXX年第XXX周**/private String yearAndWeek;public String getDay() {return day;}public void setDay(String day) {this.day = day;}public LocalDate getStartTime() {return startTime;}public void setStartTime(LocalDate startTime) {this.startTime = startTime;}public LocalDate getEndTime() {return endTime;}public void setEndTime(LocalDate endTime) {this.endTime = endTime;}public Integer getStartTimeNumber() {return startTimeNumber;}public void setStartTimeNumber(Integer startTimeNumber) {this.startTimeNumber = startTimeNumber;}public Integer getEndTimeNumber() {return endTimeNumber;}public void setEndTimeNumber(Integer endTimeNumber) {this.endTimeNumber = endTimeNumber;}public String getYearAndWeek() {return yearAndWeek;}public void setYearAndWeek(String yearAndWeek) {this.yearAndWeek = yearAndWeek;}@Overridepublic String toString() {return "WeekEntity{" +"day='" + day + '\'' +", startTime=" + startTime +", endTime=" + endTime +", startTimeNumber=" + startTimeNumber +", endTimeNumber=" + endTimeNumber +", yearAndWeek='" + yearAndWeek + '\'' +'}';}
}
2.日期工具类,有各个时间段的日期数据
package com.test.common.utils;import cn.hutool.core.date.DateUtil;
import com.test.common.entity.WeekEntity;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.DayOfWeek;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.WeekFields;
import java.util.*;
import java.util.stream.Collectors;/*** 日期处理** @author * @email * @date */
public class DateUtils extends PropertyEditorSupport {/*** 时间格式(yyyy-MM-dd)*/public final static String DATE_PATTERN = "yyyy-MM-dd";/*** 时间格式(yyyyMMdd)*/public final static String PATTERN = "yyyyMMdd";/*** 时间格式(yyyy-MM-dd HH:mm:ss)*/public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";/*** 时间格式(yyyyMMddHHmmss)*/public final static String DATE_TIME_PATTERN_RULE = "yyyyMMddHHmmss";/*** 时间格式(yyyy-MM)*/public final static String DATE_YEAR_MONTH = "yyyy-MM";/*** 时间格式(yyyy-MM)*/public final static String DATE_YEAR = "yyyy";/*** 得到当前日期字符串 格式(yyyy-MM-dd) pattern可以为:"yyyy-MM-dd" "HH:mm:ss" "E"*/public static String getDate(String pattern) {return DateFormatUtils.format(new Date(), pattern);}/*** 日期格式化 日期格式为:yyyy-MM-dd** @param date 日期* @return 返回yyyy-MM-dd格式日期*/public static String format(Date date) {return format(date, DATE_PATTERN);}/*** 日期格式化 日期格式为:yyyy-MM-dd** @param date 日期* @param pattern 格式,如:DateUtils.DATE_TIME_PATTERN* @return 返回yyyy-MM-dd格式日期*/public static String format(Date date, String pattern) {if (date != null) {SimpleDateFormat df = new SimpleDateFormat(pattern);return df.format(date);}return null;}/*** 字符串转换成日期** @param strDate 日期字符串* @param pattern 日期的格式,如:DateUtils.DATE_TIME_PATTERN*/public static Date stringToDate(String strDate, String pattern) {if (StringUtils.isBlank(strDate)) {return null;}DateTimeFormatter fmt = DateTimeFormat.forPattern(pattern);return fmt.parseLocalDateTime(strDate).toDate();}/*** 根据周数,获取开始日期、结束日期** @param week 周期 0本周,-1上周,-2上上周,1下周,2下下周* @return 返回date[0]开始日期、date[1]结束日期*/public static Date[] getWeekStartAndEnd(int week) {DateTime dateTime = new DateTime();LocalDate date = new LocalDate(dateTime.plusWeeks(week));date = date.dayOfWeek().withMinimumValue();Date beginDate = date.toDate();Date endDate = date.plusDays(6).toDate();return new Date[]{beginDate, endDate};}/*** 对日期的【秒】进行加/减** @param date 日期* @param seconds 秒数,负数为减* @return 加/减几秒后的日期*/public static Date addDateSeconds(Date date, int seconds) {DateTime dateTime = new DateTime(date);return dateTime.plusSeconds(seconds).toDate();}/*** 对日期的【分钟】进行加/减** @param date 日期* @param minutes 分钟数,负数为减* @return 加/减几分钟后的日期*/public static Date addDateMinutes(Date date, int minutes) {DateTime dateTime = new DateTime(date);return dateTime.plusMinutes(minutes).toDate();}/*** 对日期的【小时】进行加/减** @param date 日期* @param hours 小时数,负数为减* @return 加/减几小时后的日期*/public static Date addDateHours(Date date, int hours) {DateTime dateTime = new DateTime(date);return dateTime.plusHours(hours).toDate();}/*** 对日期的【天】进行加/减** @param date 日期* @param days 天数,负数为减* @return 加/减几天后的日期*/public static Date addDateDays(Date date, int days) {DateTime dateTime = new DateTime(date);return dateTime.plusDays(days).toDate();}/*** 对日期的【周】进行加/减** @param date 日期* @param weeks 周数,负数为减* @return 加/减几周后的日期*/public static Date addDateWeeks(Date date, int weeks) {DateTime dateTime = new DateTime(date);return dateTime.plusWeeks(weeks).toDate();}/*** 对日期的【月】进行加/减** @param date 日期* @param months 月数,负数为减* @return 加/减几月后的日期*/public static Date addDateMonths(Date date, int months) {DateTime dateTime = new DateTime(date);return dateTime.plusMonths(months).toDate();}/*** 对日期的【年】进行加/减** @param date 日期* @param years 年数,负数为减* @return 加/减几年后的日期*/public static Date addDateYears(Date date, int years) {DateTime dateTime = new DateTime(date);return dateTime.plusYears(years).toDate();}/*** 得到当前时间的前N小时** @param ihour* @return*/public static String getBeforeByHourTime(int ihour) {String returnstr = "";Calendar calendar = Calendar.getInstance();calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) - ihour);SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");returnstr = df.format(calendar.getTime());return returnstr;}// 获取当前时间和6小时前的时间public static Map<String, Object> dealTime(int hour) {Calendar calendar = Calendar.getInstance();Calendar calendar2 = Calendar.getInstance();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");calendar2.add(Calendar.MINUTE, 1); //往前1分钟String etime = simpleDateFormat2.format(calendar2.getTime());int a = Calendar.HOUR_OF_DAY;calendar.set(Calendar.HOUR_OF_DAY, calendar.get((Calendar.HOUR_OF_DAY)) - hour);String stime = simpleDateFormat.format(calendar.getTime());Map<String, Object> map = new HashMap<String, Object>();map.put("stime", stime);map.put("etime", etime);return map;}/*** lxl* <p>* 返回两个时间段之间的所有日期** @param beginDate* @param endDate*/public static List<String> getDatesBetweenTwoDate(String beginDate, String endDate)throws ParseException, ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");List<String> lDate = new ArrayList<String>();Date date = null;try {date = new SimpleDateFormat("yyyy-MM-dd").parse(beginDate);} catch (ParseException e) {e.printStackTrace();}String dateString = sdf.format(date);lDate.add(dateString);Calendar cal = Calendar.getInstance();cal.setTime(sdf.parse(beginDate));boolean bContinue = true;while (bContinue) {cal.add(Calendar.DAY_OF_MONTH, 1);if (sdf.parse(endDate).after(cal.getTime())) {lDate.add(sdf.format(cal.getTime()));} else {break;}}try {date = new SimpleDateFormat("yyyy-MM-dd").parse(beginDate);} catch (ParseException e) {e.printStackTrace();}String entrs = sdf.format(date);if (!dateString.equals(entrs)) {lDate.add(entrs);}return lDate;}//返回两个时间段之间的所有月包含最后一个月public static List<String> getMonthBetweenTwoDateIncludeEndDate(String beginDate, String endDate)throws ParseException, ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");List<String> lDate = new ArrayList<String>();Date date = null;try {date = new SimpleDateFormat("yyyy-MM").parse(beginDate);} catch (ParseException e) {e.printStackTrace();}String dateString = sdf.format(date);lDate.add(dateString);Calendar cal = Calendar.getInstance();cal.setTime(sdf.parse(beginDate));boolean bContinue = true;while (bContinue) {cal.add(Calendar.MONTH, 1);if (sdf.parse(endDate).after(cal.getTime())) {lDate.add(sdf.format(cal.getTime()));} else {break;}}try {date = new SimpleDateFormat("yyyy-MM").parse(endDate);} catch (ParseException e) {e.printStackTrace();}String entrs = sdf.format(date);if (!dateString.equals(entrs)) {lDate.add(entrs);}return lDate;}//返回两个时间段之间的所有日期包含最后一天public static List<String> getDatesBetweenTwoDateIncludeEndDate(String beginDate, String endDate)throws ParseException, ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");List<String> lDate = new ArrayList<String>();Date date = null;try {date = new SimpleDateFormat("yyyy-MM-dd").parse(beginDate);} catch (ParseException e) {e.printStackTrace();}String dateString = sdf.format(date);lDate.add(dateString);Calendar cal = Calendar.getInstance();cal.setTime(sdf.parse(beginDate));boolean bContinue = true;while (bContinue) {cal.add(Calendar.DAY_OF_MONTH, 1);if (sdf.parse(endDate).after(cal.getTime())) {lDate.add(sdf.format(cal.getTime()));} else {break;}}try {date = new SimpleDateFormat("yyyy-MM-dd").parse(endDate);} catch (ParseException e) {e.printStackTrace();}String entrs = sdf.format(date);if (!dateString.equals(entrs)) {lDate.add(entrs);}return lDate;}/*** lxl* <p>* 获得两个时间段之内的所有日期小时:例如传参数:"2018-12-06 01"和"2018-12-06 23", 返回结果:[2018-12-06 01,* 2018-12-06 02, 2018-12-06 03, 2018-12-06 04, ......, 2018-12-06 23]** @param beginDate* @param endDate*/public static List<String> getHoursBetweenTwoDate(String beginDate, String endDate)throws ParseException, ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH");List<String> lDate = new ArrayList<String>();Date date = null;try {date = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(beginDate);} catch (ParseException e) {e.printStackTrace();}String dateString = sdf.format(date);lDate.add(dateString);Calendar cal = Calendar.getInstance();cal.setTime(sdf.parse(beginDate));boolean bContinue = true;while (bContinue) {cal.add(Calendar.HOUR, 1);if (sdf.parse(endDate).after(cal.getTime())) {lDate.add(sdf.format(cal.getTime()));} else {break;}}try {date = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(endDate);} catch (ParseException e) {e.printStackTrace();}String endstr = sdf.format(date);lDate.add(endstr);return lDate;}/*** lxl* 获得两个时间段内所有的分钟,例如:传参“2018-11-20 00:00”和“2018-11-22 23:59”, 将会返回["2018-11-20* 00:01","2018-11-20 00:02","2018-11-20 00:03"......,"2018-11-22* 23:58","2018-11-22 23:59"]** @param beginDate* @param endDate* @return*/public static List<String> getMinuteBetweenTwoDate(String beginDate, String endDate)throws ParseException, ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");List<String> lDate = new ArrayList<String>();lDate.add(beginDate);// 把开始时间加入集合Calendar cal = Calendar.getInstance();// 使用给定的 Date 设置此 Calendar 的时间cal.setTime(sdf.parse(beginDate));boolean bContinue = true;while (bContinue) {// 根据日历的规则,为给定的日历字段添加或减去指定的时间量cal.add(Calendar.MINUTE, 1);// 测试此日期是否在指定日期之后if (sdf.parse(endDate).after(cal.getTime())) {lDate.add(sdf.format(cal.getTime()));} else {break;}}lDate.add(endDate);// 把结束时间加入集合return lDate;}/*** 获得某天所有的分钟** @param day* @return* @throws ParseException* @throws ParseException*/public static List<String> getMinutes(String day) throws ParseException, ParseException {List<String> minuteList = getMinuteBetweenTwoDate(day + " 00:00", day + " 23:59");return minuteList;}/*** 获得i以内的随机整数** @param i* @return*/public static String getSecond(int i) {long l = Math.round(Math.random() * i);if (l < 10) {return "0" + l;} else {if (l != i) {return "" + l;} else {return l - 1 + "";}}}/*** 获得i以内的随机数,保留两位小数** @param i* @return*/public static String getRandom(int i) {double d = Math.random() * i;return String.format("%.2f", d);}//获取两个时间之间的小时数public static int getDayNum(String stime, String etime) {SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date now = null;Date date = null;try {now = df.parse(etime);date = df.parse(stime);} catch (ParseException e) {e.printStackTrace();}long l = now.getTime() - date.getTime();int day = (int) l / (24 * 60 * 60 * 1000);int hour = (int) (l / (60 * 60 * 1000));int min = (int) ((l / (60 * 1000)));int s = (int) (l / 1000);
// System.out.println(""+day+"天"+hour+"小时"+min+"分"+s+"秒");return hour;}//获取两个时间之间的小时数public static int getHourNums(String stime, String etime) {SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date now = null;Date date = null;try {now = df.parse(etime);date = df.parse(stime);} catch (ParseException e) {e.printStackTrace();}long l = now.getTime() - date.getTime();int day = (int) l / (24 * 60 * 60 * 1000);int hour = (int) (l / (60 * 60 * 1000));int min = (int) ((l / (60 * 1000)));int s = (int) (l / 1000);
// System.out.println(""+day+"天"+hour+"小时"+min+"分"+s+"秒");return hour;}//获取两个时间之间的天数public static int getDayNums(String stime, String etime) {SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date now = null;Date date = null;try {now = df.parse(etime);date = df.parse(stime);} catch (ParseException e) {e.printStackTrace();}long l = now.getTime() - date.getTime();int day = (int) l / (24 * 60 * 60 * 1000);int hour = (int) (l / (60 * 60 * 1000));int min = (int) ((l / (60 * 1000)));int s = (int) (l / 1000);
// System.out.println(""+day+"天"+hour+"小时"+min+"分"+s+"秒");return day;}/*** lxl* 返回两个时间段之间的所有日期* 动态设置时间格式** @param beginDate* @param endDate*/public static List<String> getDatesBetweenT(String beginDate, String endDate, String simpleFormat)throws ParseException, ParseException {SimpleDateFormat sdf = new SimpleDateFormat(simpleFormat);List<String> lDate = new ArrayList<String>();Date date = null;try {date = new SimpleDateFormat(simpleFormat).parse(beginDate);} catch (ParseException e) {e.printStackTrace();}String dateString = sdf.format(date);lDate.add(dateString);Calendar cal = Calendar.getInstance();cal.setTime(sdf.parse(beginDate));boolean bContinue = true;while (bContinue) {cal.add(Calendar.DAY_OF_MONTH, 1);if (sdf.parse(endDate).after(cal.getTime())) {lDate.add(sdf.format(cal.getTime()));} else {break;}}try {date = new SimpleDateFormat(simpleFormat).parse(beginDate);} catch (ParseException e) {e.printStackTrace();}String entrs = sdf.format(date);if (!dateString.equals(entrs)) {lDate.add(entrs);}return lDate;}/*** @param minDate* @param maxDate* @return* @throws ParseException lxl* 获得两段时间内的所有月份*/public static List<String> getMonthBetween(String minDate, String maxDate) throws ParseException {ArrayList<String> result = new ArrayList<String>();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)) {result.add(sdf.format(curr.getTime()));curr.add(Calendar.MONTH, 1);}return result;}/*** @return* @throws ParseException lxl* 返回两个时期 共有多少天。*/public static int daysOfTwo_2(String stime, String etime) throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");/*** 跨年不会出现问题*/Date fDate = sdf.parse(stime);Date oDate = sdf.parse(etime);Long a = ((oDate.getTime() - fDate.getTime()) / (1000 * 3600 * 24));int days = a.intValue();return days;}/*** 获得当前系统时间*/public static String getNowDate() {SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return df.format(new Date());}/*** 获得月份的所有日期*/public static int getDaysOfMonth(Date date) {Calendar calendar = Calendar.getInstance();calendar.setTime(date);return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);}/*** 获取某年第一天日期** @param year 年份* @return Date*/public static Date getCurrYearFirst(int year) {Calendar calendar = Calendar.getInstance();calendar.clear();calendar.set(Calendar.YEAR, year);Date currYearFirst = calendar.getTime();return currYearFirst;}/*** 获取某年最后一天日期** @param year 年份* @return Date*/public static Date getCurrYearLast(int year) {Calendar calendar = Calendar.getInstance();calendar.clear();calendar.set(Calendar.YEAR, year);calendar.roll(Calendar.DAY_OF_YEAR, -1);Date currYearLast = calendar.getTime();return currYearLast;}/*** 获取指定日期分钟** @param date* @return*/public static int getRightMinute(Date date) {Calendar c = Calendar.getInstance();c.setTime(date);return c.get(Calendar.MINUTE);}/*** 获取指定时间 加上/减去指定的分钟** @return*/public static Date getRightDate(Date date, int minute) {Calendar c = Calendar.getInstance();c.setTime(date);c.add(Calendar.MINUTE, minute);return c.getTime();}/*** 得到当前年份字符串 格式(yyyy)*/public static String getYear() {return formatDate(new Date(), "yyyy");}/*** 得到日期字符串 默认格式(yyyy-MM-dd) pattern可以为:"yyyy-MM-dd" "HH:mm:ss" "E"*/public static String formatDate(Date date, Object... pattern) {String formatDate = null;if (pattern != null && pattern.length > 0) {formatDate = DateFormatUtils.format(date, pattern[0].toString());} else {formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");}return formatDate;}/*** 得到当前月份字符串 格式(MM)*/public static String getMonth() {return formatDate(new Date(), "MM");}/*** 得到当天字符串 格式(dd)*/public static String getDay() {return formatDate(new Date(), "dd");}/*** @Description: 获取一个日期的所在月的开始和结束时间"2016-02-05 00:00:00"->"2016-02-05 00:00:00" "2016-02-05 00:00:00"* @Author: cjk* @CreateDate: 2019/8/14*/public static Map<String,Object> getYearToMonthStartEnd(String dateStr){SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Calendar c = Calendar.getInstance();Calendar c1 = Calendar.getInstance();try {c.setTime(sdf.parse(dateStr));c.add(Calendar.MONTH, 0);//设置为1号,当前日期既为本月第一天c.set(Calendar.DAY_OF_MONTH, 1);c1.setTime(sdf.parse(dateStr));c1.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));c1.set(Calendar.HOUR_OF_DAY, 23);c1.set(Calendar.MINUTE, 59);c1.set(Calendar.SECOND, 59);} catch (ParseException e) {e.printStackTrace();}Map<String,Object> map = new HashMap<>();map.put("stime",DateUtils.formatDate(c.getTime(),"yyyy-MM-dd HH:mm:ss"));map.put("etime",DateUtils.formatDate(c1.getTime(),"yyyy-MM-dd HH:mm:ss"));return map;}/*** 根据开始时间,结束时间 获取中间所有周** @param startTime* @param endTime* @return*/public static List<WeekEntity> getWeekList(java.time.LocalDate startTime, java.time.LocalDate endTime) {List<WeekEntity> resultList = new ArrayList<WeekEntity>();java.time.format.DateTimeFormatter df = java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd");//判断是否同一周WeekFields weekFields = WeekFields.of(DayOfWeek.MONDAY, 4);if (startTime.get(weekFields.weekOfWeekBasedYear()) == endTime.get(weekFields.weekOfWeekBasedYear())) {WeekEntity firstWeek = new WeekEntity();firstWeek.setDay(startTime + "~" + endTime);firstWeek.setStartTime(startTime);firstWeek.setEndTime(endTime);firstWeek.setStartTimeNumber(Integer.valueOf(df.format(startTime)));firstWeek.setEndTimeNumber(Integer.valueOf(df.format(endTime)));resultList.add(firstWeek);return resultList;}//开始周TemporalAdjuster FIRST_OF_WEEK = TemporalAdjusters.ofDateAdjuster(localDate -> localDate.minusDays(localDate.getDayOfWeek().getValue() - DayOfWeek.MONDAY.getValue()));java.time.LocalDate startFirstWeek = startTime.with(FIRST_OF_WEEK); //开始周开始日期TemporalAdjuster LAST_OF_WEEK = TemporalAdjusters.ofDateAdjuster(localDate -> localDate.plusDays(DayOfWeek.SUNDAY.getValue() - localDate.getDayOfWeek().getValue()));java.time.LocalDate endFirstWeek = startTime.with(LAST_OF_WEEK); //开始周结束日期//结束周TemporalAdjuster FIRST_OF_WEEK1 = TemporalAdjusters.ofDateAdjuster(localDate -> localDate.minusDays(localDate.getDayOfWeek().getValue() - DayOfWeek.MONDAY.getValue()));java.time.LocalDate startLastWeek = endTime.with(FIRST_OF_WEEK1);TemporalAdjuster LAST_OF_WEEK1 = TemporalAdjusters.ofDateAdjuster(localDate -> localDate.plusDays(DayOfWeek.SUNDAY.getValue() - localDate.getDayOfWeek().getValue()));java.time.LocalDate endLastWeek = endTime.with(LAST_OF_WEEK1);//将第一周添加WeekEntity firstWeek = new WeekEntity();firstWeek.setDay(startTime + "~" + endFirstWeek);firstWeek.setStartTime(startTime);firstWeek.setEndTime(endFirstWeek);firstWeek.setStartTimeNumber(Integer.valueOf(df.format(startTime)));firstWeek.setEndTimeNumber(Integer.valueOf(df.format(endFirstWeek)));resultList.add(firstWeek);while (true) {startFirstWeek = startFirstWeek.plusDays(7);if (startFirstWeek.with(LAST_OF_WEEK).equals(startLastWeek.with(LAST_OF_WEEK1))) {break;} else {WeekEntity week = new WeekEntity();week.setDay(startFirstWeek.with(FIRST_OF_WEEK) + "~" + startFirstWeek.with(LAST_OF_WEEK));week.setStartTime(startFirstWeek.with(FIRST_OF_WEEK));week.setEndTime(startFirstWeek.with(LAST_OF_WEEK));week.setStartTimeNumber(Integer.valueOf(df.format(startFirstWeek.with(FIRST_OF_WEEK))));week.setEndTimeNumber(Integer.valueOf(df.format(startFirstWeek.with(LAST_OF_WEEK))));resultList.add(week);//System.out.println("日期="+startFirstWeek+"开始周="+startFirstWeek.with(FIRST_OF_WEEK)+"结束周="+startFirstWeek.with(LAST_OF_WEEK));}}WeekEntity lastWeek = new WeekEntity();lastWeek.setDay(startLastWeek + "~" + endTime);lastWeek.setStartTime(startLastWeek);lastWeek.setEndTime(endTime);lastWeek.setStartTimeNumber(Integer.valueOf(df.format(startLastWeek)));lastWeek.setEndTimeNumber(Integer.valueOf(df.format(endTime)));resultList.add(lastWeek);return resultList;}/*** 字符串转LocalDate* @param date* @return*/public static java.time.LocalDate getLocalDateByDateStr(String date) {Instant instant = DateUtil.parse(date).toInstant();ZoneId zone = ZoneId.systemDefault();LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);java.time.LocalDate localDate = localDateTime.toLocalDate();return localDate;}/*** 根据日期获取所属第几周* @param date* @return*/public static int getWeekNum(String date) {Instant instant = DateUtil.parse(date).toInstant();ZoneId zone = ZoneId.systemDefault();LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);java.time.LocalDate localDate = localDateTime.toLocalDate();// WeekFields.ISO = 一星期从周一开始算, 其它的请自己摸索.WeekFields weekFields = WeekFields.ISO;int weekNumber = localDate.get(weekFields.weekOfWeekBasedYear());return weekNumber;}/*** 根据日期获取所属第几周* @param date* @return*/public static String getWeekAndYear(Date date){int year = DateUtil.year(date);Instant instant = date.toInstant();ZoneId zone = ZoneId.systemDefault();LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);java.time.LocalDate localDate= localDateTime.toLocalDate();// WeekFields.ISO = 一星期从周一开始算, 其它的请自己摸索.WeekFields weekFields = WeekFields.ISO;int weekNumber = localDate.get(weekFields.weekOfWeekBasedYear());return year + "年第" + weekNumber + "周";}/*** 获取时间段内所有季度** @param startTime 开始时间* @param endTime 结束时间*/public static List<String> getSeasonList(java.time.LocalDate startTime, java.time.LocalDate endTime) {// 取当月第一天, 避免startTime的日期大于endTime计算不出来的情况startTime = java.time.LocalDate.of(startTime.getYear(), startTime.getMonthValue(), 1);endTime = java.time.LocalDate.of(endTime.getYear(), endTime.getMonthValue(), 1);Set<String> set = new HashSet<>();java.time.LocalDate mark = startTime;while (true) {if (mark.isBefore(endTime) || mark.isEqual(endTime)) {String season = String.valueOf(mark.getYear()) + String.valueOf((mark.getMonthValue() + 2) / 3);set.add(season);// 加一个月mark = mark.plusMonths(1);} else {break;}}// set中是倒序, 重新排序return set.stream().sorted().collect(Collectors.toList());}/*** 获取两个日期之间的所有年** @param startTime* @param endTime* @return:list*/public static List<String> getYearBetweenDate(String startTime, String endTime) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy");// 声明保存日期集合List<String> list = new ArrayList<>();try {// 转化成日期类型Date startDate = sdf.parse(startTime);Date endDate = sdf.parse(endTime);//用Calendar 进行日期比较判断Calendar calendar = Calendar.getInstance();while (startDate.getTime() <= endDate.getTime()) {// 把日期添加到集合list.add(sdf.format(startDate));// 设置日期calendar.setTime(startDate);//把年数增加 1calendar.add(Calendar.YEAR, 1);// 获取增加后的日期startDate = calendar.getTime();}} catch (Exception e) {e.printStackTrace();}return list;}/*** 根据日期获取季度* @param dateStr* @return*/public static String getYearAndQuarter(String dateStr){Date date = DateUtil.parse(dateStr);int year = DateUtil.year(date);Calendar calendar = Calendar.getInstance();calendar.setTime(date);int month = calendar.get(Calendar.MONTH)+1;int quarter = (month-1)/3 + 1;return year + "" + quarter;
// return year + "年" + quarter + "季度";}/*** 根据日期获取季度* @param dateStr* @return*/public static String convertQuarter(String dateStr){if(dateStr.length() == 5) {return dateStr.substring(0,4) + "年" + dateStr.substring(4,5) + "季度";}else{return "";}}/*** 根据yyyy-MM-dd日期获取年份* @param date* @return*/public static String getYear(String date){String[] yearArray = date.split("-");return yearArray[0];}
}
PropertyEditorSupport.java没有实际使用可去掉;
相关文章:
按日,周,月,季,年统计;获取对应的时间段
按日,周,月,季,年统计;获取对应的时间段 1.周实体类:WeekEntity.java package com.test.common.entity;import java.time.LocalDate;public class WeekEntity {private String day;/*** 开始日期**/privat…...

【eNSP】交换机(vlan和vlan间通信)
【eNSP】交换机(vlan和vlan间通信) 原理术语过程 实验根据图片连接模块配置设备名称和IP地址配置交换机交换机链路指定sw1配置sw2配置 设置网关交换机互联实验设置查看设置结果 ospf配置 原理 HUB集线器:它的作用可以简单的理解为将一些机器…...

2011年下半年 软件设计师 上午试卷2
博主介绍:✌全网粉丝3W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…...
Linux中安装MySQL8版本,安装MySQL步骤,MySQL8离线安装
Linux中安装MySQL8版本的步骤如下: 1.检查下libaio.so.1的位置 [roottdx ]# whereis libaio.so.1 libaio.so: /usr/lib64/libaio.so.1 如果没有找到该文件 (1).在线安装 [roottdx ]# yum install -y libaio (2).离线安装: 上传之后执行命令安装&#…...

MES生产管理系统如何与ERP系统集成
MES生产管理系统和ERP企业管理系统是制造企业信息化的重要组成部分,它们在生产管理、资源计划和业务流程等方面发挥着重要作用。实现MES与ERP系统的集成,可以更好地优化企业生产流程,提高生产效率和降低成本。本文将探讨MES管理系统解决方案如…...
Kafka如何保证消息⼀定能被消费
Kafka 通过多种机制来保证消息一定能被消费,从而实现数据的可靠性和持久性。 以下是一些常见的方法和策略来提高消息的可靠性: 复制机制: Kafka 使用了分区和副本的概念。每个分区可以有多个副本,分布在不同的 Broker 上。当消息…...

[USACO1.5] 八皇后 Checker Challenge
题目描述 一个如下的 6 x 6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。 上面的布局可以用序列 2 4 6 1 3 5 来描述,第…...

【Mysql】MVCC版本机制的多并发
🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风…...

Vue--》打造个性化医疗服务的医院预约系统(六)
今天开始使用 vue3 + ts 搭建一个医院预约系统的前台页面,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的GithHub上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关…...

Unity ARFoundation 配置工程 (Android)
注意: 1、AR Core是Google的产品,因为谷歌制裁华为,所以 有些 华为机可能不支持AR Core的软件; 2、手机在设置里搜索Google Play,看看是否已经安装上了,如果没有装此服务,去商城里搜索Google Pl…...

【广州虚拟现实开发】VR智能中控系统进一步提高VR教学管理水平
随着科技的不断发展,虚拟现实(VR)技术已经逐渐走进了人们的生活。在教育领域,VR技术也得到了广泛的应用,尤其是在教学终端中控系统方面。那么,广州华锐互动开发的VR智能中控系统对学校有何益处呢? 首先,VR智…...

关于WordPress 的时间倒计时
点击跳转...

极光笔记 | 如何为您的业务开发和训练一个AI-BOT
生成式AI(Generative AI)是当今科技领域的前沿技术之一。随着数据量的不断增加和计算能力的不断提升,AI技术在企业和个人生活中的应用越来越广泛。AI-BOT(以下简称BOT)是生成式AI技术的其中一种重要的应用形式…...
如何给ELK日志加上索引
问题记录 1、遇到长流程的时候,日志记录是非常重要的。如何排查日志,可以在MDC中去put对应的值,这样就等于对你关心的关键字段加上了索引,在elk中可以通过该索引就能 容易排查到问题 logback的设置 可以参照: 【总体…...
elementUI遇到的问题记录
一、 组件:el-table 问题:使用动态数据创建多级表头后,刷新页面时,table行会串行,某些列丢失,图片列未显示图片 解决方案:给el-table增加key <el-table :key"${Matn.random()}${ite…...

计算机竞赛 协同过滤电影推荐系统
文章目录 1 简介1 设计概要2 课题背景和目的3 协同过滤算法原理3.1 基于用户的协同过滤推荐算法实现原理3.1.1 步骤13.1.2 步骤23.1.3 步骤33.1.4 步骤4 4 系统实现4.1 开发环境4.2 系统功能描述4.3 系统数据流程4.3.1 用户端数据流程4.3.2 管理员端数据流程 4.4 系统功能设计 …...

网络综合布线实训室建设方案
一、网络综合布线系统概述 网络综合布线系统是为了满足数据通信需求而设计和建立的一套基础设施。它提供了数据传输、信号传输和电力供应的基础结构,支持各种网络设备和终端设备之间的连接。 网络综合布线系统通常包括以下组成部分: 1) 数据…...

【山河送书第七期】:《强化学习:原理与Python实战》揭秘大模型核心技术RLHF!
《强化学习:原理与Python实战》揭秘大模型核心技术RLHF! 一图书简介二RLHF是什么?三RLHF适用于哪些任务?四RLHF和其他构造奖励模型的方法相比有何优劣?五什么样的人类反馈才是好反馈?六如何减小人类反馈带来…...
LeetCode 400. 第 N 位数字——JAVA
题目描述: 给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...] 中找出并返回第 n 位上的数字。 示例 1: 输入:n 3 输出:3示例 2: 输入:n 11 输出࿱…...

解决生成式AI落地之困,亚马逊云科技提供完整解决方案
生成式AI技术无疑是当前最大的时代想象力之一。 资本、创业者、普通人都在涌入生成式AI里去一探究竟:“百模大战”连夜打响,融资规模连创新高,各种消费类产品概念不断涌现……根据Bloomberg Intelligence 的报告,2022年生成式AI 市…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...

GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...