java日期处理年,半年,季度,月,周等

package com.common.util;

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

public enum DateUtils {
	private final static DateTimeFormatter dtf_date = DateTimeFormatter.ISO_LOCAL_DATE;

	public static LocalDateTime getLocalDateTime(String date, String pattern) {
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
		LocalDateTime ldt = LocalDateTime.parse(date, formatter);
		return ldt;
	}

	public static String getDateTimeStr(LocalDateTime dateTime, String pattern) {
		if(dateTime == null) {
			return "";
		}
		DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
        return dateTime.format(dateTimeFormatter);
	}

	public static String getLocalDateStr(LocalDate dateTime, String pattern) {
		if(dateTime == null) {
			return "";
		}
		DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
        return dateTime.format(dateTimeFormatter);
	}
	/**
	 * 获取今天:年-月-日
	 * @return
	 */
	public static String getTodayYmd() {
		return LocalDate.now().format(dtf_date);
	}
	public static String getYesterdayYmd() {
		return LocalDate.now().minusDays(1).format(dtf_date);
	}
	public static String getTomorrowYmd() {
		return LocalDate.now().minusDays(-1).format(dtf_date);
	}
	/**
	 * 季度:开始/结束date
	public static String[] getQuaterDays(int amount) {
		LocalDate date = LocalDate.now().plusMonths(amount*3);
		int month = date.getMonth().getValue();
		if(month <= 3) {
			return new String[]{date.plusMonths(1-month).with(TemporalAdjusters.firstDayOfMonth()).format(dtf_date),
					date.withMonth(3).with(TemporalAdjusters.lastDayOfMonth()).format(dtf_date)};
		} else if(month <= 6) {
			return new String[]{date.plusMonths(4-month).with(TemporalAdjusters.firstDayOfMonth()).format(dtf_date),
					date.withMonth(6).with(TemporalAdjusters.lastDayOfMonth()).format(dtf_date)};
		} else if(month <= 9) {
			return new String[]{date.plusMonths(7-month).with(TemporalAdjusters.firstDayOfMonth()).format(dtf_date),
					date.withMonth(9).with(TemporalAdjusters.lastDayOfMonth()).format(dtf_date)};
		} else {
			return new String[]{date.plusMonths(10-month).with(TemporalAdjusters.firstDayOfMonth()).format(dtf_date),
					date.withMonth(12).with(TemporalAdjusters.lastDayOfMonth()).format(dtf_date)};
		}
	}
	 */
	/**
	 * 年:开始/结束date
	 * */
	public static String[] getYearDays(int amount) {
		LocalDate date = LocalDate.now().plusYears(amount);
		String start = date.with(TemporalAdjusters.firstDayOfYear()).format(dtf_date);
		String end = date.with(TemporalAdjusters.lastDayOfYear()).format(dtf_date);
		return new String[] {start, end};
	}

	/**
	 * 过去的num天
	 * @param amount
	 * @return
	public static String[] getLastNumDays(int amount) {
		LocalDate date = LocalDate.now();
		String start = date.plusDays(amount).format(dtf_date);
		String end = date.plusDays(-1).format(dtf_date);
				
		return new String[] {start, end};
	}
	 */
	/**
	 * 将来的NUm天
	 * @param amount
	 * @return
	public static String[] getNextNumDays(int amount) {
		LocalDate date = LocalDate.now();
		String start = date.plusDays(1).format(dtf_date);
		String end = date.plusDays(amount).format(dtf_date);
				
		return new String[] {start, end};
	}
	 */
	/**
	 * 获取自然周周期:周一/周日
	 * @param amount
	 * 	当前周:0
	 * 	上一周:-1
	 * 	下一周:1
	 * @return
	 */
	public static String[] getNaturalWeekCycle(int amount) {
		Calendar calendar = Calendar.getInstance(Locale.CHINA);
		calendar.setFirstDayOfWeek(Calendar.MONDAY);//以周一为首日
		calendar.setTimeInMillis(System.currentTimeMillis());//当前时间
		calendar.add(Calendar.DAY_OF_MONTH, amount*7);
		
		calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);//周一
		LocalDateTime start = LocalDateTime.ofInstant(Instant.ofEpochMilli(calendar.getTimeInMillis()), ZoneOffset.of("+8"));

		calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);//周日		
		LocalDateTime end = LocalDateTime.ofInstant(Instant.ofEpochMilli(calendar.getTimeInMillis()), ZoneOffset.of("+8"));
		
		return new String[] {getDateTimeStr(start, "yyyy-MM-dd"), getDateTimeStr(end, "yyyy-MM-dd")};
	}

	/**
	 * 获取自然月周期:第一天/最后一天
	 * @param amount
	 * 	当前月:0
	 * 	上一月:-1
	 * 	下一月:1
	 * @return
	 */
	public static String[] getNaturalMonthCycle(int amount) {
		Calendar calendar = Calendar.getInstance(Locale.CHINA);
		calendar.setTimeInMillis(System.currentTimeMillis());//当前时间
		calendar.add(Calendar.MONTH, amount);
		
		calendar.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
		LocalDateTime start = LocalDateTime.ofInstant(Instant.ofEpochMilli(calendar.getTimeInMillis()), ZoneOffset.of("+8"));
		calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));// 获取当前月最后一天
		LocalDateTime end = LocalDateTime.ofInstant(Instant.ofEpochMilli(calendar.getTimeInMillis()), ZoneOffset.of("+8"));
		
		return new String[] {getDateTimeStr(start, "yyyy-MM-dd"), getDateTimeStr(end, "yyyy-MM-dd")};
	}
    /**
     * @return 返回当前年
     */
    public static String getTodayYYYY() {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy");
        return LocalDate.now().format(dateTimeFormatter);
    }
	/**
	 * @Description: 获取季度第一天
	 * 1.根据给定日期计算当前季度的第一个月份
	 * 2.设置日历的月份为当前季度的第一个月份
	 * 3.最后设置日历月份天数为第一天即可
	 **/
	public static String getQuarterStart(Date date) {
		Calendar startCalendar = Calendar.getInstance();
		startCalendar.setTime(date);
		//get方法:获取给定日历属性的值,如 endCalendar.get(Calendar.MONTH) 获取日历的月份
		//计算季度数:由于月份从0开始,即1月份的Calendar.MONTH值为0,所以计算季度的第一个月份只需 月份 / 3 * 3
		startCalendar.set(Calendar.MONTH, (((int) startCalendar.get(Calendar.MONTH)) / 3) * 3);
		startCalendar.set(Calendar.DAY_OF_MONTH, 1);
		LocalDateTime start = LocalDateTime.ofInstant(Instant.ofEpochMilli(startCalendar.getTimeInMillis()), ZoneOffset.of("+8"));
		return getDateTimeStr(start, "yyyy-MM-dd");
	}

	/**
	 * @Description: 获取季度最后一天
	 **/
	public static String getQuarterEnd(Date date) { // 季度结束
		Calendar endCalendar = Calendar.getInstance();
		endCalendar.setTime(date);
		//计算季度数:由于月份从0开始,即1月份的Calendar.MONTH值为0,所以计算季度的第三个月份只需 月份 / 3 * 3 + 2
		endCalendar.set(Calendar.MONTH, (((int) endCalendar.get(Calendar.MONTH)) / 3) * 3 + 2);
		endCalendar.set(Calendar.DAY_OF_MONTH, endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH));
		LocalDateTime start = LocalDateTime.ofInstant(Instant.ofEpochMilli(endCalendar.getTimeInMillis()), ZoneOffset.of("+8"));
		return getDateTimeStr(start, "yyyy-MM-dd");
	}
	/**
	 * @Description: 获取半年度最后一天
	 **/
	public static String getHalfYearEnd() { // 季度结束
		Calendar cDay = Calendar.getInstance();
		int curMonth = cDay.get(Calendar.MONTH);
		if (curMonth >= Calendar.JANUARY && curMonth <= Calendar.JUNE){
			cDay.set(Calendar.MONTH, Calendar.JUNE);
		}
		if (curMonth >= Calendar.JULY && curMonth <= Calendar.DECEMBER) {
			cDay.set(Calendar.MONTH, Calendar.DECEMBER);
		}
		cDay.set(Calendar.DAY_OF_MONTH, cDay.getActualMaximum(Calendar.DAY_OF_MONTH));
		//也可以设置小时分钟秒
		//cDay.set(Calendar.HOUR,0);
		//cDay.set(Calendar.MINUTE,0);
		//cDay.set(Calendar.SECOND,0);
		LocalDateTime start = LocalDateTime.ofInstant(Instant.ofEpochMilli(cDay.getTimeInMillis()), ZoneOffset.of("+8"));
		return getDateTimeStr(start, "yyyy-MM-dd");
	}

	/**
	 * 获取前/后半年的开始时间
	 * @return
	 */
	public static   String getHalfYearStartTime(){
		Calendar c = Calendar.getInstance();
		int currentMonth = c.get(Calendar.MONTH) + 1;
		String now = null;
		try {
			if (currentMonth >= 1 && currentMonth <= 6){
				c.set(Calendar.MONTH, 0);
			}else if (currentMonth >= 7 && currentMonth <= 12){
				c.set(Calendar.MONTH, 6);
			}
			c.set(Calendar.DATE, 1);
			LocalDateTime start = LocalDateTime.ofInstant(Instant.ofEpochMilli(c.getTimeInMillis()), ZoneOffset.of("+8"));
			return getDateTimeStr(start, "yyyy-MM-dd");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return now;

	}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值