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

前言:

之前做记账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()));
    }
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349