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

2019-03-01  本文已影响0人  Negen

问题描述

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
上一篇下一篇

猜你喜欢

热点阅读