美文网首页Android深入
【Java】判断当前日期所在的时间段(今日、本周、本月、本季度、

【Java】判断当前日期所在的时间段(今日、本周、本月、本季度、

作者: 感同身受_ | 来源:发表于2020-08-05 09:57 被阅读0次

    前言:

    之前做记账app的时候,需要根据当前日期去查询当前所在的时间段,以方便统计这段时间内的支出总额,这里写一个工具类,方便下次需要的时候直接来拿,下面开始介绍:

    内容概述:

    一、Calender类的简述
    二、对时间段的处理
    三、效果
    四、源码

    具体内容:

    一、Calender类的简述:

    Calender类是一个方便用于日期计算的类,比如计算一年以后的时间,直接cal.add(Calendar.YEAR, 1);,或是计算2个月后的时间,直接cal.add(Calendar.MONTH, 2);,而不用像Date类一样去计算毫秒,但是Calender类也有一个坑,就是他的月份都是从0开始的,如果当前月份为3月,cal.get(Calendar.MONTH);得到的是2(这点不足在JDK1.8后的LocalDate类中有改善),这是平时使用的时候需要注意的一点

    二、对时间段的处理:

    1. 时分秒的处理:
      每一段时间的开始都是用某日的00:00:00开始的,以最后一天的23:59:59结束的,所以我们直接设置开始时间的Calender的时分秒为0,结束时间的Calender的时分秒为23:59:59
    //开始时间
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    
    //结束时间
    calendar.set(Calendar.HOUR_OF_DAY, 23);
    calendar.set(Calendar.MINUTE, 59);
    calendar.set(Calendar.SECOND, 59);
    
    1. 本周的开始时间和结束时间
      本周的开始,通过设置Calendar.DAY_OF_WEEKCalendar.MONDAY
      本周的结束,通过把Calendar.DAY_OF_WEEK加6,就能得到星期日的日期
    //开始
    cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
    cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
    
    //结束
    cal.add(Calendar.DAY_OF_WEEK, 6);
    
    1. 本月的开始时间和结束时间
      本月的开始:将Calendar.DAY_OF_MONTH属性设置为1,就得到了当前月份的第一天
      本月的结束:先通过calendar.getActualMaximum(Calendar.DAY_OF_MONTH)得到当前月的最后一天,再赋值给Calendar.DAY_OF_MONTH属性即可
    //开始
    calendar.setTimeInMillis(new Date().getTime());
    calendar.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
    
    //结束
    calendar.setTimeInMillis(new Date().getTime());
    calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));// 获取当前月最后一天
    
    1. 本季度的开始时间和结束时间
      本季度的开始:通过获取c.get(Calendar.MONTH)加1后的结果,得到当前的月份(加1是因为Calender中每个月都是从0开始的),然后判断当前月是哪个季度的,得到当前季度得时间
      本季度的结束:在得到本季度开始的时间后,将月份加2个月cal.add(Calendar.MONTH, 2);,并按照之前得到本月最后一天那样处理一次即可
    //开始
    int currentMonth = c.get(Calendar.MONTH) + 1;
    if (currentMonth >= 1 && currentMonth <= 3)
        c.set(Calendar.MONTH, 0);
    else if (currentMonth >= 4 && currentMonth <= 6)
        c.set(Calendar.MONTH, 3);
    else if (currentMonth >= 7 && currentMonth <= 9)
        c.set(Calendar.MONTH, 6);
    else if (currentMonth >= 10 && currentMonth <= 12)
        c.set(Calendar.MONTH, 9);
    
    //结束
    cal.add(Calendar.MONTH, 2);
    cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));// 获取当前月最后一天
    
    1. 本年的开始时间和结束时间
      本年的开始:通过将Calendar.DAY_OF_YEAR的值设为1,就得到了本年的第一天
      本年的结束:先将Calendar.DAY_OF_YEAR的值设为1,得到本年的第一天,然后通过调用Calender的roll函数,并传递一个-1进去,最终就得到了本年的最后一天
    //开始
    calendar.setTimeInMillis(new Date().getTime());
    calendar.set(Calendar.DAY_OF_YEAR, 1);
    
    //结束
    calendar.setTimeInMillis(new Date().getTime());
    int year = calendar.get(Calendar.YEAR);
    calendar.clear();
    calendar.set(Calendar.YEAR, year);
    calendar.roll(Calendar.DAY_OF_YEAR, -1);
    
    roll函数:当传进去一个负数,就将最大值和最小值形成一个环,最小值-1=最大值
    Adds the specified (signed) amount to the specified calendar field
    without changing larger fields.  A negative amount means to roll
    down.
    

    三、效果:

    image.png

    四、源码:

    
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    
    public class DateUtils {
    
        public static String dateToString(Date date) {
            return new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(date);
        }
    
        /**
         *  
         *  根据当前日期获得所在周的日期区间(周一和周日日期) 
         * 任意一时间的当前周的时间段
         */
        public static String getTimeInterval(Date date) {
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            // 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了  
            int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天  
            if (1 == dayWeek) {
                cal.add(Calendar.DAY_OF_MONTH, -1);
            }
            // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一  
            cal.setFirstDayOfWeek(Calendar.MONDAY);
            // 获得当前日期是一个星期的第几天  
            int day = cal.get(Calendar.DAY_OF_WEEK);
            // 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值  
            cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            String imptimeBegin = sdf.format(cal.getTime());
            // System.out.println("所在周星期一的日期:" + imptimeBegin);  
            cal.add(Calendar.DATE, 6);
            String imptimeEnd = sdf.format(cal.getTime());
            // System.out.println("所在周星期日的日期:" + imptimeEnd);  
            return imptimeBegin + "," + imptimeEnd;
        }
    
        /**
         * 获取今天开始时间
         */
        public static Date getTodayStartTime() {
            Calendar todayStart = Calendar.getInstance();
            //注:这里不能用Calendar.HOUR,因为他是12小时制,而Calendar.HOUR_OF_DAY才是24小时制
            todayStart.set(Calendar.HOUR_OF_DAY, 0);
            todayStart.set(Calendar.MINUTE, 0);
            todayStart.set(Calendar.SECOND, 0);
            todayStart.set(Calendar.MILLISECOND, 0);
            return todayStart.getTime();
        }
    
        /**
         * 获取今天结束时间
         */
        public static Date getTodayEndTime() {
            Calendar todayEnd = Calendar.getInstance();
            todayEnd.set(Calendar.HOUR_OF_DAY, 23);
            todayEnd.set(Calendar.MINUTE, 59);
            todayEnd.set(Calendar.SECOND, 59);
            todayEnd.set(Calendar.MILLISECOND, 999);
            return todayEnd.getTime();
        }
    
        // 获得本周一0点时间
        public static Date getCurrentWeekStartTimes() {
            Calendar cal = Calendar.getInstance();
            cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
            cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
            return cal.getTime();
        }
    
        // 获得本周日24点时间
        public static Date getCurrentWeekEndTimes() {
            Calendar cal = Calendar.getInstance();
            cal.setTime(getCurrentWeekStartTimes());
            cal.add(Calendar.DAY_OF_WEEK, 6);
            cal.set(Calendar.HOUR_OF_DAY, 23);
            cal.set(Calendar.MINUTE, 59);
            cal.set(Calendar.SECOND, 59);
            cal.set(Calendar.MILLISECOND, 999);
            return cal.getTime();
        }
    
        /**
         * 获取当月开始时间戳
         *
         * @return
         */
        public static Date getCurrentMonthStartTimes() {
            Calendar calendar = Calendar.getInstance();// 获取当前日期
            calendar.setTimeInMillis(new Date().getTime());
            calendar.add(Calendar.YEAR, 0);
            calendar.add(Calendar.MONTH, 0);
            calendar.add(Calendar.DATE, 0);
            calendar.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MILLISECOND, 0);
            return calendar.getTime();
        }
    
        /**
         * 获取当月的结束时间戳
         *
         * @return
         */
        public static Date getCurrentMonthEndTimes() {
            Calendar calendar = Calendar.getInstance();// 获取当前日期
            calendar.setTimeInMillis(new Date().getTime());
            calendar.add(Calendar.YEAR, 0);
            calendar.add(Calendar.MONTH, 0);
            calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));// 获取当前月最后一天
            calendar.set(Calendar.HOUR_OF_DAY, 23);
            calendar.set(Calendar.MINUTE, 59);
            calendar.set(Calendar.SECOND, 59);
            calendar.set(Calendar.MILLISECOND, 999);
            return calendar.getTime();
        }
    
        public static Date getCurrentQuarterStartTime() {
            Calendar c = Calendar.getInstance();
            int currentMonth = c.get(Calendar.MONTH) + 1;
            SimpleDateFormat longSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            SimpleDateFormat shortSdf = new SimpleDateFormat("yyyy-MM-dd");
            Date now = null;
            try {
                if (currentMonth >= 1 && currentMonth <= 3)
                    c.set(Calendar.MONTH, 0);
                else if (currentMonth >= 4 && currentMonth <= 6)
                    c.set(Calendar.MONTH, 3);
                else if (currentMonth >= 7 && currentMonth <= 9)
                    c.set(Calendar.MONTH, 6);
                else if (currentMonth >= 10 && currentMonth <= 12)
                    c.set(Calendar.MONTH, 9);
                c.set(Calendar.DATE, 1);
                now = longSdf.parse(shortSdf.format(c.getTime()) + " 00:00:00");
            } catch (Exception e) {
                e.printStackTrace();
            }
            return now;
        }
    
        /**
         * 当前季度的结束时间,即2012-03-31 23:59:59
         */
        public static Date getCurrentQuarterEndTime() {
            Calendar cal = Calendar.getInstance();
            cal.setTime(getCurrentQuarterStartTime());
            cal.add(Calendar.MONTH, 2);
            cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));// 获取当前月最后一天
            cal.set(Calendar.HOUR_OF_DAY, 23);
            cal.set(Calendar.MINUTE, 59);
            cal.set(Calendar.SECOND, 59);
            cal.set(Calendar.MILLISECOND, 999);
    
            return cal.getTime();
        }
    
        /**
         * 获取当年的开始时间戳
         *
         * @return
         */
        public static Date getCurrentYearStartTime() {
            Calendar calendar = Calendar.getInstance();// 获取当前日期
            calendar.setTimeInMillis(new Date().getTime());
            calendar.add(Calendar.YEAR, 0);
            calendar.add(Calendar.MONTH, 0);
            calendar.set(Calendar.DAY_OF_YEAR, 1);
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MILLISECOND, 0);
            return calendar.getTime();
        }
    
        /**
         * 获取当年的最后时间戳
         *
         * @return
         */
        public static Date getCurrentYearEndTime() {
            Calendar calendar = Calendar.getInstance();// 获取当前日期
            calendar.setTimeInMillis(new Date().getTime());
            int year = calendar.get(Calendar.YEAR);
            calendar.clear();
            calendar.set(Calendar.YEAR, year);
            calendar.set(Calendar.HOUR_OF_DAY, 23);
            calendar.set(Calendar.MINUTE, 59);
            calendar.set(Calendar.SECOND, 59);
            calendar.set(Calendar.MILLISECOND, 999);
            calendar.roll(Calendar.DAY_OF_YEAR, -1);
            return calendar.getTime();
        }
    
        public static void main(String[] args) {
            System.out.println("今日: " + dateToString(getTodayStartTime()) + "---> " + dateToString(getTodayEndTime()));
            System.out.println("本周: " + dateToString(getCurrentWeekStartTimes()) + "---> " + dateToString(getCurrentWeekEndTimes()));
            System.out.println("本月: " + dateToString(getCurrentMonthStartTimes()) + "---> " + dateToString(getCurrentMonthEndTimes()));
            System.out.println("本季: " + dateToString(getCurrentQuarterStartTime()) + "---> " + dateToString(getCurrentQuarterEndTime()));
            System.out.println("本年: " + dateToString(getCurrentYearStartTime()) + "---> " + dateToString(getCurrentYearEndTime()));
        }
    }
    
    

    相关文章

      网友评论

        本文标题:【Java】判断当前日期所在的时间段(今日、本周、本月、本季度、

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