Java教程

Java日期工具获取指定月份周明细和获取两个月份间隔月份明细

本文主要是介绍Java日期工具获取指定月份周明细和获取两个月份间隔月份明细,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

获取指定月份周明细

package com.ruoyi.ad.util;


import java.text.SimpleDateFormat;
import java.time.*;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.WeekFields;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author: 谢辉
 * @date: 2021/4/14
 * @email: xieh_mail@163.com
 * @description: 获取每个月有几周,并且每周的开始日期和结束日期
 * 国内都是以周一开始,注:即使第一天是周末,也算一周
 * @modifiedBy:
 * @version: 1.0
 */
public class AdDateUtils {

    /**
     * 获取指定月份有几周,每周的开始日期和结束日期
     *
     * @param yearMonth
     * @return
     */
    public static Map<Integer, WeekData> weeks(YearMonth yearMonth) {
        // 获取指定月份的第一天
        LocalDate start = LocalDate.now().with(yearMonth).with(TemporalAdjusters.firstDayOfMonth());
        // 获取指定月份的最后一天
        LocalDate end = LocalDate.now().with(yearMonth).with(TemporalAdjusters.lastDayOfMonth());

        Map<Integer, WeekData> map = Stream.iterate(start, localDate -> localDate.plusDays(1l))
                .limit(ChronoUnit.DAYS.between(start, end) + 1)
                // DayOfWeek.MONDAY 这里是指定周一(MONDAY)为一周的开始
                .collect(Collectors.groupingBy(localDate -> localDate.get(WeekFields.of(DayOfWeek.MONDAY, 1).weekOfMonth()),
                        Collectors.collectingAndThen(Collectors.toList(), WeekData::new)));
        return map;

    }

    /**
     * 获取指定时期的后面月份的第一天开始时间
     *
     * @param startDate 开始时间
     * @param month     第几个月
     * @return
     */
    public static Date getMonthDate(Date startDate, int month) {
        LocalDateTime localDateTime = startDate.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalDateTime().plusMonths(month);
        Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
        return date;
    }


    public static class WeekData {
        // 一周的开始时间
        private LocalDate start;
        // 一周的结束时间
        private LocalDate end;

        public WeekData(List<LocalDate> localDates) {
            this.start = localDates.get(0);
            this.end = localDates.get(localDates.size() - 1);
        }

        @Override
        public String toString() {
            return this.start + "~" + this.end;
        }
    }

    public static void main(String[] args) throws Exception {
        System.out.println(weeks(YearMonth.of(2021, 4)));

        String targetStr = YearMonth.now().toString() + "-01";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = getMonthDate(sdf.parse(targetStr), 2);
        System.out.println("后2个月的时间:" + sdf.format(date));

    }
}

 

获取两个月份间隔月份明细

package com.demo;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;

/**
 * 计算两个月份相隔的明细
 * @author XH
 *
 */
public class TestDate {

    public static int getDay(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.DATE);
    }

    /** * 返回日期的月份,1-12,即yyyy-MM-dd中的MM * * @param date * @return */
    public static int getMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.MONTH) + 1;
    }

    /** * 返回日期的年,即yyyy-MM-dd中的yyyy * * @param date * Date * @return int */
    public static int getYear(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.YEAR);
    }

    public static int getDaysOfMonth(int year, int month) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month - 1, 1);
        return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    }


    public static int calDiffMonth(String startDate,String endDate){
        int result=0;
        try {
            SimpleDateFormat sfd=new SimpleDateFormat("yyyy-MM");
            Date start = sfd.parse(startDate);
            Date end = sfd.parse(endDate);
            int startYear=getYear(start);
            int startMonth=getMonth(start);
            int startDay=getDay(start);
            int endYear=getYear(end);
            int endMonth=getMonth(end);
            int endDay=getDay(end);
            if (startDay>endDay){ //1月17 大于 2月28
                if (endDay==getDaysOfMonth(getYear(new Date()),2)){   //也满足一月
                    result=(endYear-startYear)*12+endMonth-startMonth;
                }else{
                    result=(endYear-startYear)*12+endMonth-startMonth-1;
                }
            }else{
                result=(endYear-startYear)*12+endMonth-startMonth;
            }

        } catch (ParseException e) {
            e.printStackTrace();
        }

        return result;
    }

    public static List<String> getBetweenDateByMonth(String startDate,String endDate){
        List<String> results =  new ArrayList<String>();
        // 判断两个月份的间隔数量
        int count = calDiffMonth(startDate,endDate);
        // 如果两个日期相等
        if(count == 0) {
            results.add(startDate);
            results.add(endDate);
            return results;
        }
        if(count > 0) {
            YearMonth now = YearMonth.parse(startDate, DateTimeFormatter.ofPattern("yyyy-MM"));
            results.add(startDate);
            for (int i = 1; i <= count; i++) {
                // 参数-1 是获取下个月的月份
                YearMonth nextMonths = now.minusMonths(-i);
                results.add(nextMonths.toString());
            }
            return results;
        }
        if(count < 0) {
            YearMonth now = YearMonth.parse(startDate, DateTimeFormatter.ofPattern("yyyy-MM"));
            results.add(startDate);
            count = Math.abs(count);
            for (int i = 1; i <= count; i++) {
                // 参数1 是获取上个月的月份
                YearMonth nextMonths = now.minusMonths(i);
                results.add(nextMonths.toString());
            }
             Collections.reverse(results);
             return results;
            //return results;
        }
        return results;
    }

    
    
    public static void main(String[] args) {
        List<String> betweenDateByMonth = getBetweenDateByMonth("2020-04", "2020-08");
        System.out.println(betweenDateByMonth.toString());

    }

}

 

这篇关于Java日期工具获取指定月份周明细和获取两个月份间隔月份明细的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!