java 时间工具类 dateUtils

1.工具类


import lombok.extern.slf4j.Slf4j;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.*;

/**
 * 时间工具类
 */
@Slf4j
public class DateUtil {

	/**
	 * DateFormat:yyyy-MM
	 */
	public static final String FORMATE_YYYY_MM_MINUS = "yyyy-MM";

	/**
	 * DateFormat:yyyy-MM-dd
	 */
	public static final String FORMATE_YYYY_MM_DD_MINUS = "yyyy-MM-dd";

	/**
	 * DateFormat:yyyy-MM-dd HH:mm:ss
	 */
	public static final String FORMATE_YYYY_MM_DD_HH_MM_SS_MINUS = "yyyy-MM-dd HH:mm:ss";

	/**
	 * 将字符串装换成日期类型
	 *
	 * @param str 需要转换的字符串
	 * @return Date 转换后的日期
	 */
	public static Date convertToDate(String str, String format) {
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		try {
			return sdf.parse(str);
		} catch (ParseException pse) {
			return null;
		}
	}

	/**
	 * 将日期转换成指定格式的字符串
	 *
	 * @param date
	 * @param format
	 * @return
	 */
	public static String convertDateToStr(Date date, String format) {
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		return sdf.format(date);
	}

	/**
	 * 将日期转换成指定格式的日期
	 * @param date
	 * @return
	 */
	public static Date convertDateToDate(Date date, String format){
		String dateToStr = DateUtil.convertDateToStr(date, format);
		return DateUtil.convertToDate(dateToStr,format);
	}

	/**
	 * 获取日期的00:00:00
	 * @param date 日期
	 */
	public static Date getStartTimeAsDate(Date date){
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.HOUR_OF_DAY,0);
		calendar.set(Calendar.MINUTE,0);
		calendar.set(Calendar.SECOND,0);
		calendar.set(Calendar.MILLISECOND,0);
		return calendar.getTime();
	}

	/**
	 * 获取日期的23:59:59
	 * @param date 日期
	 */
	public static Date getEndTimeAsDate(Date date){
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.HOUR_OF_DAY,23);
		calendar.set(Calendar.MINUTE,59);
		calendar.set(Calendar.SECOND,59);
		calendar.set(Calendar.MILLISECOND,999);
		return calendar.getTime();
	}

	/**
	 * 获取两个日期之间的所有日期集合(格式:yyyy-MM-dd)
	 * @param startTime
	 * @param endTime
	 * @return
	 */

	public static List<String> getDays(String startTime, String endTime) {
		// 返回的日期集合
		List<String> days = new ArrayList<>();
		DateFormat dateFormat = new SimpleDateFormat(FORMATE_YYYY_MM_DD_MINUS);
		try {
			Date start = dateFormat.parse(startTime);
			Date end = dateFormat.parse(endTime);
			Calendar tempStart = Calendar.getInstance();
			tempStart.setTime(start);
			Calendar tempEnd = Calendar.getInstance();
			tempEnd.setTime(end);
			tempEnd.add(Calendar.DATE, +1);// 日期加1(包含结束)
			while (tempStart.before(tempEnd)) {
				days.add(dateFormat.format(tempStart.getTime()));
				tempStart.add(Calendar.DAY_OF_YEAR, 1);
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return days;
	}

	/**
	 * 获取当前日期是星期几
	 * @param date
	 * @return 当前日期是星期几
	 */
	public static Integer getWeek(Date date) {
		//{ "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" }
		Integer[] weekDays = { 7, 1, 2, 3, 4, 5, 6 };
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
		if (w < 0)
			w = 0;
		return weekDays[w];
	}

	/**
	 * 获取当前日期是星期几
	 * @param date
	 * @return 当前日期是星期几
	 */
	public static String getWeekToString(Date date) {
		String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
		if (w < 0)
			w = 0;
		return weekDays[w];
	}

	/**
	 * 获取上(下)周周几的日期
	 * 值范围 {'SUNDAY': '星期日','MONDAY':'星期一','TUESDAY':'星期二','WEDNESDAY':'星期三','THURSDAY':'星期四','FRIDAY':'星期五','SATURDAY':'星期六'}
	 * @param weekOffset  周偏移,上周为-1,本周为0,下周为1,以此类推
	 */
	public static Date getDayOfWeek(int dayOfWeek, int weekOffset){
		Calendar date = Calendar.getInstance(Locale.CHINA);
		//周数减一,即上周
		date.add(Calendar.WEEK_OF_MONTH,weekOffset);
		//日子设为周几
		date.set(Calendar.DAY_OF_WEEK, dayOfWeek);
		//时分秒全部置0
		date.set(Calendar.HOUR_OF_DAY, 0);
		date.set(Calendar.MINUTE, 0);
		date.set(Calendar.SECOND, 0);
		date.set(Calendar.MILLISECOND, 0);
		return date.getTime();
	}

	/**
	 * 获取指定时间内, 星期几的所有日期
	 * @param start 开始日期 2020-04-01
	 * @param end   截止日期 2020-05-01
	 * @param week  星期几 1
	 * @return List<Date> [2020-04-06, 2020-04-13, 2020-04-20, 2020-04-27]
	 * 左闭右开 ['2020-12-03','2020-12-17'] 不包含 2020-12-03
	 */
	public static List<Date> getWeekInTimes(String start, String end, int week) {
		List<Date> list = new ArrayList<>();
		//字符串转LocalDate
		LocalDate startLocalDate = LocalDate.parse(start, DateTimeFormatter.ofPattern(DateUtil.FORMATE_YYYY_MM_DD_MINUS));
		LocalDate endLocalDate = LocalDate.parse(end, DateTimeFormatter.ofPattern(DateUtil.FORMATE_YYYY_MM_DD_MINUS));

		long days = ChronoUnit.DAYS.between(startLocalDate, endLocalDate);
		log.info("[开始时间:{}, 结束时间{}]之间共有: {}天", start, end, days);

		//计算有多少, 指定星期几
		Calendar startCalender = GregorianCalendar.from(startLocalDate.atStartOfDay(ZoneId.systemDefault()));
		//for (int i = 0; i < days - 1; i++) {
		for (int i = 0; i < days; i++) {
			startCalender.add(Calendar.DATE, 1);

			if (startCalender.get(Calendar.DAY_OF_WEEK) == week + 1) {// 1代表周日,7代表周六
				LocalDate localDate = LocalDateTime.ofInstant(startCalender.toInstant(), ZoneOffset.systemDefault()).toLocalDate();
				ZoneId zone = ZoneId.systemDefault();
				Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
				Date date = Date.from(instant);
				list.add(date);
			}
		}
		log.info("[开始时间:{}, 结束时间:{}]之间共有: {}个 星期{}", start, end, list.size(), week);
		return list;
	}

	/**
	 * @param nowTime   当前时间
	 * @param startTime	 开始时间
	 * @param endTime   结束时间
	 * @author 判断当前时间在时间区间内
	 */
	public static boolean inScope(Date nowTime, Date startTime, Date endTime) {
		if (nowTime == null){
			throw new RuntimeException("当前时间不能为空!");
		}
		if (startTime == null){
			throw new RuntimeException("开始时间不能为空!");
		}
		if (endTime == null){
			throw new RuntimeException("结束时间不能为空!");
		}

		if (nowTime.getTime() == startTime.getTime() || nowTime.getTime() == endTime.getTime()) {
			return true;
		}

		Calendar date = Calendar.getInstance();
		date.setTime(nowTime);

		Calendar begin = Calendar.getInstance();
		begin.setTime(startTime);

		Calendar end = Calendar.getInstance();
		end.setTime(endTime);

		if (date.after(begin) && date.before(end)) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 获取结束时间
	 * @param date
	 * @return
	 */
	public static Date getDayEndTime(Date date) {
		Calendar dateEnd = Calendar.getInstance();
		dateEnd.setTime(date);
		dateEnd.set(Calendar.HOUR_OF_DAY, 23);
		dateEnd.set(Calendar.MINUTE, 59);
		dateEnd.set(Calendar.SECOND, 59);
		return dateEnd.getTime();
	}

	/**
	 * 获取月份结束时间
	 * @param month
	 * @return
	 */
	public static Date getMonthEnd(String month,String format){
		Date monthDate = DateUtil.convertToDate(month, format);
		if (monthDate == null){
			return null;
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(monthDate);
		calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
		calendar.set(Calendar.HOUR_OF_DAY, 23);
		calendar.set(Calendar.MINUTE, 59);
		calendar.set(Calendar.SECOND, 59);
		return calendar.getTime();
	}

}

2.测试类


import com.alibaba.fastjson.JSON;
import com.har.utils.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.*;

@Slf4j
@SpringBootTest
public class DateUtilTest {

	@Test
	public void getDayOfWeekTest(){
		Date dayOfWeek = DateUtil.getDayOfWeek(Calendar.SATURDAY, -1);
		log.info("响应: "+dayOfWeek);
	}

	@Test
	public void getWeekTest(){
		Integer week = DateUtil.getWeek(new Date());
		if (4 > week){
			log.info("响应: "+"大于周四");
		} else {
			log.info("响应: "+"小于周四");
		}
	}

	@Test
	public void getWeekInTimesTest(){
		List<Map<String,Object>> resultList = new ArrayList<>();
		List<Date> weekInTimes = DateUtil.getWeekInTimes("2020-12-01", "2020-11-31", 3);
		log.info("时间: " + JSON.toJSONString(weekInTimes));
		for (Date date : weekInTimes) {
			Calendar calendar = Calendar.getInstance();
			calendar.setTime(date);
			Date startDate = calendar.getTime();
			calendar.add(Calendar.DAY_OF_MONTH, -6);
			Date endDate = calendar.getTime();
			Map<String,Object> map = new HashMap<>();
			map.put("startTime",DateUtil.convertDateToStr(startDate,DateUtil.FORMATE_YYYY_MM_DD_MINUS));
			map.put("endTime",DateUtil.convertDateToStr(endDate,DateUtil.FORMATE_YYYY_MM_DD_MINUS));
			resultList.add(map);
			log.info("开始时间:{}, 结束时间:{}", startDate, endDate);
		}
		log.info("时间结果: " + JSON.toJSONString(resultList));
	}

	@Test
	public void inScopeTest(){
		Date date = DateUtil.convertDateToDate(new Date(),DateUtil.FORMATE_YYYY_MM_DD_MINUS);
		Date startDate = DateUtil.convertToDate("2020-12-17", DateUtil.FORMATE_YYYY_MM_DD_MINUS);
		Date endDate = DateUtil.convertToDate("2020-12-18", DateUtil.FORMATE_YYYY_MM_DD_MINUS);
		boolean result = DateUtil.inScope(date, startDate, endDate);
		log.info("响应: "+result);
	}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值