美文网首页
Java输出两个日期之间的天、周、月

Java输出两个日期之间的天、周、月

作者: Negen | 来源:发表于2019-03-01 17:47 被阅读0次

    问题描述

    1、输出两个日期之间的每一天(DAY)
    2、输出两个日期之间的每一周的区间(WEEK)
    3、输出两个日期之间的每个月份(MONTH)


    前驱知识(三个常用的Class)

    Date
    java.util 包提供了 Date 类来封装当前的日期和时间。

    SimpleDateFormat
    SimpleDateFormat 是一个以语言环境敏感的方式来格式化和分析日期的类。SimpleDateFormat 允许你选择任何用户自定义日期时间格式来运行。
    常见用法(date格式化转日期字符串互转):

    String dateStr = "2018-12-12"
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    //日期字符串转Date
    Date date  = sdf.parse(dateStr );
    //Date转日期字符串
    String ret = sdf.format(date); 
    

    Calendar
    Calendar是日历的意思,区别于Date,Date是一个绝对时间,而Calendar是对时间的一种描述方式,不同国家、不同地区描述方式不同。

    //获取Calendar实例的四种方式的区别(常用前两种)
    //1.getInstance():使用默认的时区、默认的位置创建实例
    Calendar c1 = Calendar.getInstance();
    //2.getInstance(TimeZone zone):使用指定的时区、默认的位置创建实例
    Calendar c2 = Calendar.getInstance(Locale.CHINA);
    //3.getInstance(Locale aLocale):使用默认的时区、指定的位置创建实例
    Calendar c3 = Calendar.getInstance(TimeZone.getTimeZone("GMT+9"));
    //4.getInstance(TimeZone zone,Locale aLocale)使用指定的时区、指定的位置创建实例
    Calendar c4 = Calendar.getInstance(TimeZone.getTimeZone("GMT+9"), Locale.US);
    
    //本文用到的 Calendar 的方法
    Calendar calendar= Calendar.getInstance();
    //设置Calendar初始日期
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    calendar.setTime(sdf.parse("2018-12-12"));
    //获取当前日期
    calendar.getTime();
    //往后增长一天(负整数就是后退 X 天)
    calendar.add(Calendar.DAY_OF_MONTH, 1);
    //加减一周
    calendar.add(Calendar.WEEK_OF_MONTH, 1);
    //加减一个月
    calendar.add(Calendar.MONTH, 1);
    //获取当前日期是当月的第几天
    calendar.get(Calendar.DAY_OF_MONTH)
    //获取当日是本周的第几周
    calendar.get(Calendar.DAY_OF_WEEK)
    //获取当月最大天数
    calendar.getActualMaximum(Calendar.DAY_OF_MONTH)
    //还有很多自行探索0.0
    

    上代码(注解都在里面0.0,java8可以用 LocalDate 来遍历哦)

    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    
    /**
     * @author Negen
     * @createTime 2019/03/01
     * @fileName DateUtil.java
     */
    public class DateForEachUtil {
        private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        static final int DAY = 1;       //日
        static final int WEEK = 2;      //周
        static final int MONTH = 3;     //月
    
    
        /**
         * 遍历两个日期之间的日、周、月
         * @param startDateStr   开始日期字符串
         * @param endDateStr     结束字符串
         * @param Flag           遍历的标志,按日还是按周遍历    DAY:日  WEEK:周  MONTH:月
         */
        public static void dateForEach(String startDateStr, String endDateStr, Integer Flag) throws ParseException {
            //将字符串类型的日期转换为Date类型并加载到Calendar中(有异常直接抛)
            Date startDate = sdf.parse(startDateStr);
            Date endDate = sdf.parse(endDateStr);
            //实例化Calendar(为什么要实例化两个Calendar,肯定是为了后面要用啊0.0)
            Calendar startCalendar = Calendar.getInstance();
            Calendar endCalendar = Calendar.getInstance();
            //将两个日期加载到Calendar中
            startCalendar.setTime(startDate);
            endCalendar.setTime(endDate);
            //开始遍历
            switch (Flag){
                case DAY:
                    //按日遍历
                    while(true){
                        String currentDateStr = sdf.format(startCalendar.getTime());
                        System.out.println("currentDateStr========>" + currentDateStr);
                        //日期加1
                        startCalendar.add(Calendar.DAY_OF_MONTH, 1);
                        //当前日期和结束日历日期比较,超过结束日期则终止
                        if(startCalendar.after(endCalendar))break;
                    }
                    break;
                case WEEK:
                        //按周输出
                        while(true){
                            String firstAndSecondStr = "";
                            String secondDateStr = "";
                            String firstDateStr = sdf.format(startCalendar.getTime());
                            startCalendar.add(Calendar.DAY_OF_MONTH, 6);
                            secondDateStr = sdf.format(startCalendar.getTime());
                            if (startCalendar.after(endCalendar)){
                                startCalendar.add(Calendar.DAY_OF_MONTH, -6);
                                if(sdf.format(startCalendar.getTime()).equals(endDateStr)){
    
                                    firstAndSecondStr = endDateStr + "~" + endDateStr;
    //                                System.out.println(firstAndSecondStr);
                                    resultMap.put(firstAndSecondStr, null);
                                    break;
                                }
                                else{
                                    firstDateStr = sdf.format(startCalendar.getTime());
                                    firstAndSecondStr = firstDateStr + "~" + endDateStr;
    //                                System.out.println(firstAndSecondStr);
                                    resultMap.put(firstAndSecondStr, null);
                                    break;
                                }
                            };
                            firstAndSecondStr = firstDateStr + "~" + secondDateStr;
                            resultMap.put(firstAndSecondStr, null);
                            startCalendar.add(Calendar.DAY_OF_MONTH, 1);
                            if (startCalendar.equals(endCalendar)){
                                resultMap.put(sdf.format(startCalendar.getTime()) + "~" + endDateStr, null);
                                break;}
                            if (startCalendar.after(endCalendar))
                                break;
    
                        }
                        break;
                case MONTH:
                    while(true){
                        //和按日输出差不多
                        String currentDateStr = sdf.format(startCalendar.getTime()).substring(0,7);
                        System.out.println("currentDateStr========>" + currentDateStr);
                        //日期加1
                        startCalendar.add(Calendar.MONTH, 1);
                        //当前日期和结束日历日期比较,超过结束日期则终止
                        if(startCalendar.after(endCalendar))break;
                    }
            }
        }
    
        //测试
        public static void main(String[] args) throws ParseException {
            String startDateStr = "2018-05-01";
            String endDateStr = "2018-05-09";
            DateForEachUtil.dateForEach(startDateStr, endDateStr, WEEK);
        }
    }
    
    
    

    运行效果

    按天输出
    1、天.png
    按周输出
    2、周.png
    按月输出
    3、月.png

    相关文章

      网友评论

          本文标题:Java输出两个日期之间的天、周、月

          本文链接:https://www.haomeiwen.com/subject/ljfjuqtx.html