日历工具

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * Created by liuyangyang_live on 2019/9/25.
 */
public class CalendarUtil {

    public static final String YEAR = "year";
    public static final String MONTH = "month";
    public static final String MONTH_FIRST_DAY_TIME = "month_first_day_time";
    public static final String MONTH_LAST_DAY_TIME = "month_last_day_time";




    //获取当前年的前5年数据
    public static List<String> getPre5Years() {
        List<String> years = new ArrayList<String>();
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        for (int i = 0; i < 5; i++) {
            years.add((year - i) + "");
        }
        return years;
    }

    //获取12个月的数据
    public static List<String> get12MonthStr() {
        List<String> months = new ArrayList<String>();
        for (int i = 1; i < 13; i++) {
            months.add(i + "");
        }
        return months;
    }

    //获取当前明天的数据
    public static String getNextDay(String format) {
        Calendar calendar = Calendar.getInstance();
        Calendar tmpCalendar = Calendar.getInstance();
        tmpCalendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));//设置本月最大日期
        int maxDate = tmpCalendar.get(Calendar.DATE);

        int month = calendar.get(Calendar.MONTH);
        int year = calendar.get(Calendar.YEAR);
        int date = calendar.get(Calendar.DATE);

        if (date + 1 > maxDate) {
            if (month + 1 > 11) {
                calendar.add(Calendar.YEAR, 1);
                calendar.set(Calendar.MONTH, 0);
                calendar.set(Calendar.DATE, 1);
            } else {
                calendar.set(year, month, date + 1);
            }
        } else {
            calendar.set(year, month, date + 1);
        }
        return getDateText(calendar.getTime(), format);
    }

    //获取n天后的日期
    public static Date getNextNDay(Date startTime, Integer n) {
        Calendar start = Calendar.getInstance();
        start.setTime(startTime);
        start.add(Calendar.DATE, n);
        return start.getTime();
    }

    //获取n天后的日期 00:00:00
    public static Date getNextNDayBegin(Date startTime, Integer n) {
        Calendar start = Calendar.getInstance();
        start.setTime(startTime);
        start.add(Calendar.DATE, n);
        start.set(Calendar.HOUR_OF_DAY, 0);
        start.set(Calendar.MINUTE, 0);
        start.set(Calendar.SECOND, 0);
        return start.getTime();
    }

    //获取n天后的日期 23:59:59
    public static Date getNextNDayEnd(Date startTime, Integer n) {
        Calendar start = Calendar.getInstance();
        start.setTime(startTime);
        start.add(Calendar.DATE, n);
        start.set(Calendar.HOUR_OF_DAY, 23);
        start.set(Calendar.MINUTE, 59);
        start.set(Calendar.SECOND, 59);
        return start.getTime();
    }

    //获取n天前的日期
    public static Date getPreNDay(Date startTime, Integer n) {
        Calendar start = Calendar.getInstance();
        start.setTime(startTime);
        start.add(Calendar.DATE, -n);
        return start.getTime();
    }

    //获取n天前的日期 00:00:00
    public static Date getPreNDayBegin(Date startTime, Integer n) {
        Calendar start = Calendar.getInstance();
        start.setTime(startTime);
        start.add(Calendar.DATE, -n);
        start.set(Calendar.HOUR_OF_DAY, 0);
        start.set(Calendar.MINUTE, 0);
        start.set(Calendar.SECOND, 0);
        return start.getTime();
    }

    //获取n天前的日期 23:59:59
    public static Date getPreNDayEnd(Date startTime, Integer n) {
        Calendar start = Calendar.getInstance();
        start.setTime(startTime);
        start.add(Calendar.DATE, -n);
        start.set(Calendar.HOUR_OF_DAY, 23);
        start.set(Calendar.MINUTE, 59);
        start.set(Calendar.SECOND, 59);
        return start.getTime();
    }

    //获取前x天的数据, x < 10;
    public static String getPreXDay(int x, String format) {
        Calendar calendar = Calendar.getInstance();
        int month = calendar.get(Calendar.MONTH);
        int year = calendar.get(Calendar.YEAR);
        int date = calendar.get(Calendar.DATE);

        if (date - x < 0) {
            if (month - 1 < 0) {
                calendar.add(Calendar.YEAR, -1);
                calendar.set(Calendar.MONTH, 11);
                calendar.set(Calendar.DATE, 31 - (x - date));
            } else {
                calendar.add(Calendar.MONTH, -1);
                calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));//设置本月最大日期
                int maxDate = calendar.get(Calendar.DATE);
                calendar.set(year, month - 1, maxDate - (x - date));
            }
        } else {
            calendar.set(year, month, date - x);
        }
        return getDateText(calendar.getTime(), format);
    }

    //获取当前年
    public static String getYear() {
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        return year + "";
    }

    //获取当前月
    public static String getMonth() {
        Calendar calendar = Calendar.getInstance();
        int month = calendar.get(Calendar.MONTH);
        month = month + 1;
        if (month > 12) {
            return "12";
        }
        return month + "";
    }

    //获取 年-月的 第一天 和 最后一天 时间
    public static Map<String, String> getMonthFirstEndDayTime(String year, String month) {
        Map<String, String> rst = new HashMap<String, String>();
        Calendar calendar = Calendar.getInstance();
        int m = Integer.parseInt(month);
        m = m - 1;
        if (m < 0) {
            m = 0;
        }
        calendar.set(Integer.parseInt(year), m, 1);
        String firstDayTime = DateUtil.COMMON.getDateText(calendar.getTime()) + " 00:00:00";

        calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));//设置本月最大日期
        String lastDayTime = DateUtil.COMMON.getDateText(calendar.getTime()) + " 23:59:59";

        rst.put(CalendarUtil.MONTH_FIRST_DAY_TIME, firstDayTime);
        rst.put(CalendarUtil.MONTH_LAST_DAY_TIME, lastDayTime);

        return rst;
    }

    //获取前一个月
    public static Map<String, String> getPreMonth() {
        Map<String, String> rst = new HashMap<String, String>();
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MONTH, -1);
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        month = month + 1;

        rst.put("year", year + "");
        if (month > 12) {
            rst.put("month", "12");
        } else {
            rst.put("month", month + "");
        }
        return rst;
    }

    //获取前一个月
    public static Map<String, String> getPreMonth(Integer year, Integer month) {
        Map<String, String> rst = new HashMap<String, String>();
        if (month == 1) {
            rst.put("year", (year - 1) + "");
            rst.put("month", "12");
        } else {
            rst.put("year", year + "");
            rst.put("month", (month - 1) + "");
        }
        return rst;
    }

    //获取开始月份和结束月份中间的所有月份,包括开始月份和结束月份
    public static List<String> getBetweenMonths(String startMonth, String endMonth) {
        String[] startArr = startMonth.split("-");
        String[] endArr = endMonth.split("-");

        Integer startY = Integer.parseInt(startArr[0]);
        Integer startM = Integer.parseInt(startArr[1]);

        Integer endY = Integer.parseInt(endArr[0]);
        Integer endM = Integer.parseInt(endArr[1]);

        Calendar startCalendar = Calendar.getInstance();
        startCalendar.set(startY, startM - 1, 1, 0, 0);

        Calendar endCalendar = Calendar.getInstance();
        endCalendar.set(endY, endM - 1, 1, 0, 0);

        List<String> months = new ArrayList<String>();
        while (startCalendar.getTimeInMillis() <= endCalendar.getTimeInMillis()) {
            months.add(DateUtil.getDateText(startCalendar.getTime(), "yyyy-MM"));
            startCalendar.add(Calendar.MONTH, 1);
        }
        return months;
    }

    //获取日期之间的天List formt = "yyyy-MM-dd"
    public static List<String> getBetweenDateStr(String startTime, String endTime) {
        List<String> dateList = new ArrayList<String>();
        try {
            Long startM = DateUtil.COMMON.getTextDate(startTime).getTime();
            Long endM = DateUtil.COMMON.getTextDate(endTime).getTime();
            long result = (endM - startM) / (24 * 60 * 60 * 1000);
            String[] startTimeStr = startTime.split("-");
            Calendar startCalendar = Calendar.getInstance();
            startCalendar.set(Integer.parseInt(startTimeStr[0]), Integer.parseInt(startTimeStr[1]) - 1, Integer.parseInt(startTimeStr[2]));
            startCalendar.add(Calendar.DATE, -1);
            for (int i = 0; i <= result; i++) {
                startCalendar.add(Calendar.DATE, 1);
                dateList.add(DateUtil.COMMON.getDateText(startCalendar.getTime()));
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return dateList;
    }

    public static List<String> getBetweenDateStr(String startTime, String endTime, String format) {
        List<String> dateList = new ArrayList<String>();
        try {
            Long startM = DateUtil.COMMON.getTextDate(startTime).getTime();
            Long endM = DateUtil.COMMON.getTextDate(endTime).getTime();
            long result = (endM - startM) / (24 * 60 * 60 * 1000);
            String[] startTimeStr = startTime.split("-");
            Calendar startCalendar = Calendar.getInstance();
            startCalendar.set(Integer.parseInt(startTimeStr[0]), Integer.parseInt(startTimeStr[1]) - 1, Integer.parseInt(startTimeStr[2]));
            startCalendar.add(Calendar.DATE, -1);
            for (int i = 0; i <= result; i++) {
                startCalendar.add(Calendar.DATE, 1);
                dateList.add(DateUtil.getDateText(startCalendar.getTime(), format));
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return dateList;
    }

    //获取日期的前n个月的月份(闭区间)
    public static List<String> getPreNMonths(String curMonth, Integer n) {
        String[] curArr = curMonth.split("-");
        Integer curY = Integer.parseInt(curArr[0]);
        Integer curM = Integer.parseInt(curArr[1]);

        Calendar curCalendar = Calendar.getInstance();
        curCalendar.set(curY, curM - 1, 1, 0, 0);

        Calendar tmpCalendar = Calendar.getInstance();
        tmpCalendar.set(curY, curM - 1 - n, 1, 0, 0);

        List<String> months = new ArrayList<String>();
        while (tmpCalendar.getTimeInMillis() <= curCalendar.getTimeInMillis()) {
            months.add(DateUtil.getDateText(tmpCalendar.getTime(), "yyyy-MM"));
            tmpCalendar.add(Calendar.MONTH, 1);
        }
        return months;
    }

    //获取当前天
    public static String getToday(String format) {
        Calendar calendar = Calendar.getInstance();
        return DateUtil.getDateText(calendar.getTime(), format);
    }

    //获取当前月的第一天
    public static String getFirstDay(String format) {
        Calendar calendar = Calendar.getInstance();
        int month = calendar.get(Calendar.MONTH);
        int year = calendar.get(Calendar.YEAR);
        calendar.set(year, month, 1);
        return DateUtil.getDateText(calendar.getTime(), format);
    }

    //获取当前月的最后一天
    public static String getLastDay(String format) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));//设置本月最大日期
        return DateUtil.getDateText(calendar.getTime(), format);
    }

    //获取当前月的第一天
    public static Date getFirstDate() {
        Calendar calendar = Calendar.getInstance();
        int month = calendar.get(Calendar.MONTH);
        int year = calendar.get(Calendar.YEAR);
        calendar.set(year, month, 1);
        return calendar.getTime();
    }

    //获取当前月的最后一天
    public static Date getLastDate() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));//设置本月最大日期
        return calendar.getTime();
    }


    //日期的天是否一样;
    public static boolean isDayEqual(Date date1, Date date2) {
        if (date1 == null || date2 == null) {
            return false;
        }
        String date1Str = DateUtil.COMPAT.getDateText(date1);
        String date2Str = DateUtil.COMPAT.getDateText(date2);
        return date1Str.equals(date2Str);
    }

    /**
     * 时间间距是否为xx;
     * 如果在 space 之内返回true;否则返回false
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param space     毫秒
     * @return
     */
    public static boolean isTimeSpace(Date startTime, Date endTime, long space) {
        if (startTime == null || endTime == null) {
            return false;
        }
        return endTime.getTime() - startTime.getTime() <= space;
    }

    /**
     * 时间间距是否在 startSpace 和 endSpace 之间
     *
     * @param startTime
     * @param endTime
     * @param startSpace
     * @param endSpace
     * @return
     */
    public static boolean isTimeBetween(Date startTime, Date endTime, long startSpace, long endSpace) {
        return endTime.getTime() - startTime.getTime() <= endSpace &&
                endTime.getTime() - startTime.getTime() >= startSpace;
    }

    public static boolean isTimeBetween(Date time, Date startTime, Date endTime) {
        return time.getTime() >= startTime.getTime() && time.getTime() <= endTime.getTime();
    }

    //获取日期之间年的距离
    public static Integer getYearSpace(Date startTime, Date endTime) {
        Calendar start = Calendar.getInstance();
        start.setTime(startTime);
        Calendar end = Calendar.getInstance();
        end.setTime(endTime);
        return end.get(Calendar.YEAR) - start.get(Calendar.YEAR);
    }

    //获取日期之间天的距离
    public static Integer getDaySpace(Date startTime, Date endTime) {
        return (int) (endTime.getTime() - startTime.getTime()) / (24 * 60 * 60 * 1000);
    }

    //获取当前日期 毫秒
    public static long getTimeInMillis() {
        Calendar now = Calendar.getInstance();
        return now.getTimeInMillis();
    }

    //获取当前日期 秒
    public static long getTimeInSeconds() {
        return getTimeInMillis() / 1000L;
    }


    /**
     * 日期获取字符串
     */
    public static String getDateText(Date date, String format) {
        return new SimpleDateFormat(format).format(date);
    }


    public static void main(String[] args) {

        System.out.println("ok");

    }


}
class DateUtil {

    private final SimpleDateFormat format;

    public DateUtil(SimpleDateFormat format) {
        this.format = format;
    }

    public SimpleDateFormat getFormat() {
        return format;
    }

    // 紧凑型日期格式,也就是纯数字类型yyyyMMdd
    public static final DateUtil COMPAT = new DateUtil(new SimpleDateFormat("yyyyMMdd"));

    // 紧凑型日期格式,也就是纯数字类型yyyyMMdd
    public static final DateUtil COMPAT_FULL = new DateUtil(new SimpleDateFormat("yyyyMMddHHmmss"));

    // 常用日期格式,yyyy-MM-dd
    public static final DateUtil COMMON = new DateUtil(new SimpleDateFormat("yyyy-MM-dd"));
    public static final DateUtil COMMON_FULL = new DateUtil(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

    // 使用斜线分隔的,西方多采用,yyyy/MM/dd
    public static final DateUtil SLASH = new DateUtil(new SimpleDateFormat("yyyy/MM/dd"));

    // 中文日期格式常用,yyyy年MM月dd日
    public static final DateUtil CHINESE = new DateUtil(new SimpleDateFormat("yyyy年MM月dd日"));
    public static final DateUtil CHINESE_FULL = new DateUtil(new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒"));

    /**
     * 日期获取字符串
     */
    public String getDateText(Date date) {
        return getFormat().format(date);
    }

    /**
     * 字符串获取日期
     * @throws ParseException
     */
    public Date getTextDate(String text) throws ParseException {
        return getFormat().parse(text);
    }

    /**
     * 日期获取字符串
     */
    public static String getDateText(Date date, String format) {
        return new SimpleDateFormat(format).format(date);
    }

    /**
     * 字符串获取日期
     * @throws ParseException
     */
    public static Date getTextDate(String dateText, String format) throws ParseException {
        return new SimpleDateFormat(format).parse(dateText);
    }

    /**
     * 根据日期,返回其星期数,周一为1,周日为7
     * @param date
     * @return
     */
    public static int getWeekDay(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int w = calendar.get(Calendar.DAY_OF_WEEK);
        int ret;
        if (w == Calendar.SUNDAY)
            ret = 7;
        else
            ret = w - 1;
        return ret;
    }

    public static int getAge(Date birthday) {
        Calendar calendar = Calendar.getInstance();
        if (calendar.before(birthday)) {
            throw new IllegalArgumentException("出生时间大于当前时间!");
        }
        int yearNow = calendar.get(Calendar.YEAR);
        int monthNow = calendar.get(Calendar.MONTH) + 1;// 注意此处,如果不加1的话计算结果是错误的
        int dayOfMonthNow = calendar.get(Calendar.DAY_OF_MONTH);
        calendar.setTime(birthday);
        int yearBirth = calendar.get(Calendar.YEAR);
        int monthBirth = calendar.get(Calendar.MONTH);
        int dayOfMonthBirth = calendar.get(Calendar.DAY_OF_MONTH);
        int age = yearNow - yearBirth;
        if (monthNow < monthBirth ||(monthNow == monthBirth && dayOfMonthNow < dayOfMonthBirth)) {
            age--;
        }
        return age;

    }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值