日期归类获取方法

## 日常总结获取时间类之===>>>获取日期
前提:
日常项目中,难免会遇到跟时间日期有关的功能需求
博主已经整理过时间戳的方法,此文是关于日期获取
本文皆用 Java 8版本之前的 java.util 包中的 Date 和 Calendar 处理

理解都在代码注释中!!!

**
代码片:
1、获取日期—>>>关于SimpleFormatDate的格式总结

	 /** 1、 获取日期
     *    对 SimpleDateFormat 中的格式参数的解析用法
     * @return  返回:2020年11月15日 01:26:08, 上下午标志:==> 上午, 星期日,一年中的第320天,
     *           一月中的第3个星期,一年中的第47个星期,一月中的第3个星期,+0800 ,时区:CST
     *   补充:    CST:China Standard Time,翻译成中文就是:中国标准时间。
     *            中国是在东八区,时间原点是在零度经线(伦敦),也就是说伦敦0点时,中国8点。
     */
    public static String formatDate(){
        StringBuilder dateFormat = new StringBuilder();
        dateFormat.append("yyyy年MM月dd日 HH:mm:ss,") // HH:24小时制(0-23),hh:12小时制(0-12)
                .append(" 上下午标志:==> a,")      // a  上下午标志
                .append(" E,")                      // E  星期几
                .append("一年中的第D天,")           // D  一年中的第几天
                .append("一月中的第F个星期,")  // F 一月中的第几个星期(会把这个月总共过的天数除以7),实际情况不推荐使用
                .append("一年中的第w个星期,")       // w(小写) 一年中的第几个星期
                .append("一月中的第W个星期,")       // W(大写) 一月中的第几个星期(会根据实际情况即日历来算)
                .append("Z ,")
                .append("时区:z");                  // z(小写) 时区  CST(China Standard Time)代表中国标准时间
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat.toString());
        String date = sdf.format(new Date());
        return date;
    }

2、时间戳(10位或13位都行)转换日期—>>> 第一种方法

    /** 2、 时间戳转换日期                第一种方法
     * 通过  时间戳   -->>>  获取 转换为指定格式的 date日期形式
     * @param timetemp  时间戳  可以是10位 也可以是13位的时间戳
     *   10位时间戳 转换为指定格式有两种方法,此处使用的是 java.sql.Timestamp; 13位可以直接转换
     * @param format  日期格式  如:yyyy-MM-dd HH:mm:ss 或 yyyy-MM-dd
     * @return        String 类型的日期
     * 如:   Long time = System.currentTimeMillis();
     *        Long time1 = System.currentTimeMillis()/1000;
     *        getTimeInMillisToDate(time,"yyyyMMdd")   结果格式 都一样 是  20190427
     */
    public static String changeTimeIToDateOne(Long timetemp,String format){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        // 如果 long 类型的时间戳是 10位的需要 使用 Timestamp 处理一下
        if (timetemp.toString().length() == 10){
            Object time = new Timestamp(timetemp*1000);
            String date = simpleDateFormat.format(time);
            return date;
        }
        String date = simpleDateFormat.format(timetemp);
        return date;
    }

3、时间戳转换日期—>>> 第二种方法

	 /** 3、 时间戳转换日期                 第二种方法
     * 将 10位 时间戳   --->>>
     *            转换为 指定格式   的日期,这是第二种方法 ,此处利用 java.util.Calendar.setTimeInMillis(time*1000)
     * @param time        Long类型 的时间戳
     * @param format     日期格式
     * @return           String类型的 日期时间,也可以返回Long类型,需要使用Long.valueOf() 或 Long.parseLong()方法
     *                   不过要注意 Long类型 的 format格式就不能有-连接符了 只能是 yyyyMMdd 这种格式
     * 如:changeTimeToDate(System.currentTimeMillis()/1000,"yyyy-MM-dd HH:mm:ss")  结果 2019-04-27 01:05:28
     */
    public static String changeTimeToDateTwo(Long time,String format){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(time*1000);
        Date dt = calendar.getTime();
        String date = simpleDateFormat.format(dt);
        return date;
    }

4、获取日期—>>>获取当前时间对应的>>>指定年份,指定月份获取

	 /** 4、 获取日期
     * 根据 输入类型   --->>>  获取当前时间 对应的  指定年份,指定月份 指定日期格式 的时间
     * @param month    指定月份  如当前为6月,1 代表上个月==>>5月  2代表 4月份
     * @param year     指定年份  如 1 代表去年  2代表前年
     * @param format   指定日期格式    决定返回  日期的 格式  可以是 yyyyMMdd , yyyy-MM-dd HH:mm:ss 多种格式
     * @return         String 类型的 日期  根据日期格式 来 返回
     *         如 当前时间是 2019/4/27  getLastDate(1,1,"yyyyMMdd") 获取 去年3月27 的时间  结果20180327
     */
    public static String getDateWithType(int month,int year,String format){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.YEAR,-year);
        calendar.add(Calendar.MONTH,-month);
        Date dt = calendar.getTime();
        String date = simpleDateFormat.format(dt);
        return date;
    }

5、周-获取周几—>>> 第一种方法 核心:Calendar

    /** 5、周-获取周几         第一种方法    核心:Calendar
     *  依据指定格式的日期,获取其日期对应的是周几
     * @param format   日期格式  如:new SimpleDateFormat("yyyyMMdd")
     * @param day      日期      如:20200520     格式需要与 format 中对应
     * @return         周三
     * @throws ParseException
     */
    public static String getWeek(SimpleDateFormat format,String day) throws ParseException {
        // 美式排序日历以星期日开始
        String[] weekDay = {"周日","周一","周二","周三","周四","周五","周六"};
        Date date = format.parse(day);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int w = calendar.get(Calendar.DAY_OF_WEEK ) - 1;
        if (w < 0)
            w =0;
        return weekDay[w];
    }

6、周-获取周几—>>> 第二种方法 核心:SimpleDateFormat

    /** 6、周-获取周几        第二种方法    核心:SimpleDateFormat
     *  依据日期获取对应的星期几
     * @param date Date类型日期  new Date()当前日期
     *             可以依据第一种方法中的SimpleDateFormat转换,
     *             也可以根据时间戳计算,如:new Date(1589036081 * 1000L)   1589036081   2020-05-09 22:54:41
     * @return    星期六
     * 补充:  对于 SimpleDateFormat 中的参数:
     *         E 代表星期,   MMMM 代表中文月份,如:十一月,   MM 代表月份,如:11
     */
    public static String getWeekTwo(Date date){
        SimpleDateFormat sdf = new SimpleDateFormat("E");
        String week = sdf.format(date);
        return week;
    }

7、周-获取某年的第几周

    /** 7、周-获取某年的第几周
     *  根据日期获取此日期属于指定年份的第几周
     * @param date 日期  如:new Date(1520836148 * 1000L)     代表 ==>> 2018-03-12 14:29:08
     * @param year 年份  如:2019
     * @return     11  说明 2018年3月12 属于 2018年的第11个周
     */
    public static int getWeekWithYear(Date date,int year){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.YEAR,year);
        int week_year = calendar.get(Calendar.WEEK_OF_YEAR);
        return week_year;
    }

8、周-当前周开始和结束日期

    /** 8、周-当前周日期
     *  获取当前时间所在周的周一和周日的日期
     * @return  如:当前时间 2019-12-1     返回:{monday=20191125, sunday=20191201}
     */
    public static Map<String,Object> getWeekDayWithNowTime(){
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        Calendar mondayCal = Calendar.getInstance();
        mondayCal.setTime(new Date());
        int weekDay = mondayCal.get(Calendar.DAY_OF_WEEK);
        String monday = null;
        if (1 == weekDay){
            mondayCal.add(Calendar.DATE,-6);
            monday = format.format(mondayCal.getTime());
        }else {
            mondayCal.setFirstDayOfWeek(Calendar.MONDAY);   // 将 Calendar.MONDAY 的值 2 赋值给一周的第一天值
            mondayCal.add(Calendar.DATE,mondayCal.getFirstDayOfWeek() - weekDay);
            monday = format.format(mondayCal.getTime());
        }
        // 为了给日历赋最新值,以便计算周日
        Date date = mondayCal.getTime();
        Calendar sundayCal = Calendar.getInstance();
        sundayCal.setTime(date);
        sundayCal.add(Calendar.DATE,+6);
        String sunday = format.format(sundayCal.getTime());
        Map<String,Object> map = new LinkedHashMap<>();
        map.put("monday",monday);
        map.put("sunday",sunday);
        return map;
    }

9、周-所有周日期------>>> 获取一段时间内所有周的周一和周日日期

    /** 9、周-所有周日期         -->>> 获取一段时间内所有周的周一和周日日期
     *  获取指定年(某一年)开始到现在当前日期,这段时间内所有周的,周一和周日的日期(包含当前时间周)
     * @param year    指定年份       如:2019
     * @param format  返回日期格式   如:new SimpleDateFormat("yyyyMMdd")
     * @return        Map类型的list集合,
     * 如:{monday=20181231, sunday=20190106}, {monday=20190107, sunday=20190113},...,{monday=20201116, sunday=20201122}]
     *     补充:1. compareTo()方法知识点
     *              compareTo 比较前后两个字符串的 asc码的差值,多字母字符串时,依次比较一个一个字符串
     *              如:a1="ac"  a2="ab",比较的第二个字符串,
     *              结果:正数代表 第一个数 大于 第二个数,负数代表第一个数 小于第二个数
     * @throws ParseException
     */
    public static List<Map<String,Object>> getAllWeekWithYear(int year, SimpleDateFormat format) throws ParseException {
        List<Map<String,Object>> weekData = new ArrayList<>();
        Calendar startDate = Calendar.getInstance();
        //代码底层,Month是以 0 为基础,0代表一月
        //原因,在公历和朱利安日历中每年的第一个月份,它是0,所以month是一个特殊的值
        startDate.set(year,0,1);       // 设置开始日期
        String startDay = format.format(startDate.getTime());
        Calendar nowDate = Calendar.getInstance();
        nowDate.setTime(new Date());
        String nowDay = format.format(nowDate.getTime());
        // 通过 while 比较指定日期与当前日期的大小,并不断使历史日期 +1,来进行循环
        while(startDay.compareTo(nowDay) <= 0){
            int dayWeek = startDate.get(Calendar.DAY_OF_WEEK);
            if (dayWeek == Calendar.SUNDAY){
                String sunday = format.format(startDate.getTime());   // 周日的日期结果
                Calendar mondayCalendat = Calendar.getInstance();
                mondayCalendat.setTime(format.parse(sunday));
                mondayCalendat.add(Calendar.DATE,-6);
                String monday = format.format(mondayCalendat.getTime());  // 周一的日期结果
                Map<String,Object> map = new LinkedHashMap<>();
                map.put("monday",monday);
                map.put("sunday",sunday);
                weekData.add(map);
            }
            // 获取当前日期所在周,注意:当前日期不能是周日!!!
            if (startDay.compareTo(nowDay) == 0 && dayWeek > Calendar.SUNDAY){
                /*周一在Calendar中,Calendar.DAY_OF_WEEK 中,数值 2 代表周一
                如果当前时间的数值 > 2,则 2 减去 当前时间的数值就是对应的周一日期
                比如说 3,3代表周二,要求周一的值,则需要减去一天,而在Calendar.add()方法中,是添加-1,就是 2-3 */
                startDate.add(Calendar.DATE,2 - dayWeek );
                String monday = format.format(startDate.getTime());
                startDate.add(Calendar.DATE,+6 );
                String sunday = format.format(startDate.getTime());
                Map<String,Object> map = new LinkedHashMap<>();
                map.put("monday",monday);
                map.put("sunday",sunday);
                weekData.add(map);
            }
            startDate.add(Calendar.DATE,1);
            startDay = format.format(startDate.getTime());
        }
        return weekData;
    }

10、月-当前月日期 ------>>> 依据 Calendat 先求开始日期,再求结束日期

    /** 10、月-当前月日期      --->>> 依据 Calendat 先求开始日期,再求结束日期
     *  根据指定年份,指定月份获取 此年此月的开始和结束日期,
     * @param year       指定年份 如:2019
     * @param month      指定月份 如:2
     * @param format     返回日期格式 如:new SimpleDateFormat("yyyyMMdd")
     * @return   Map类型的值  {beginDate=20190201, endDate=20190228}
     *  补充: 注意HashMap的存储与输出顺序!!
     */
    public static Map<String,String> getMonthWithYear(int year, int month, SimpleDateFormat format){
        //SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        Calendar cal = Calendar.getInstance();
        cal.set(year,month - 1,1);   // 先求指定月份的开始值,每个月都从1号开始,所以日期为1
        String startDate = format.format(cal.getTime());  // 结果:指定月份开始值
        // 求结束值,设置年、月、日
        cal.set(Calendar.YEAR,year);
        cal.set(Calendar.MONTH,month - 1);
        int endDateNum = cal.getActualMaximum(Calendar.DAY_OF_MONTH); // 不能使用 getMaximum()方法,具体原因看源码
        cal.set(Calendar.DATE,endDateNum);
        //cal.set(Calendar.DAY_OF_MONTH,endDateNum);   效果等同于上行代码
        String endDate = format.format(cal.getTime());    // 结果:指定年份指定月份中的最后一天
        Map<String,String> map = new HashMap<>();
        //HashMap存储数据时不会按照存储的顺序遍历输出,会按照String键值排好序输出,
        //如果要按照数据存储的顺序拿出来,则可以使用 LinkedHashMap,它是HashMap的子类,它会保存记录的插入顺序
        //map.put("startDate",startDate);
        map.put("beginDate",startDate);
        map.put("endDate",endDate);
        return map;
    }

11、月-所有月日期------>>> 依据 getMonthWithYear() 获取

    /** 11、月-所有月日期        -->>  依据 getMonthWithYear() 获取
     *  获取指定年份-指定月份,到现在为止,此段时间内所有月份的开始和结束日期
     * @param year      指定年份 如:2019
     * @param month     指定月份 如:11
     * @return   List结果集  举例:当前时间  2020-02-15
     * [{beginDate=20191101, endDate=20191130}, {beginDate=20191201, endDate=20191231},
     * {beginDate=20200101, endDate=20200131}, {beginDate=20200201, endDate=20200229}]
     */
    public static List<Map<String,String>> getAllMonth(int year,int month){
        List<Map<String,String>> monthList = new ArrayList<>();
        Date day = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
        String[] date = format.format(day).split("-");
        int nowYear = Integer.parseInt(date[0]);
        int nowMonth = Integer.parseInt(date[1]);
        while (true){
            monthList.add(getMonthWithYear(year,month,new SimpleDateFormat("yyyyMMdd")));
            if (year == nowYear && month == (nowMonth - 1)){
                //添加当前月份的开始和结束日期,+1 是因为在 getMonthWithYear()方法中的month已经减 1 了,不+1就相当于减了2次
                // 如果不要包含当前月份的开始结束日期,则去掉此行代码
                monthList.add(getMonthWithYear(year,month + 1,new SimpleDateFormat("yyyyMMdd")));
                return monthList;
            }
            month = month + 1;
            if (13 == month){
                year = year + 1;
                month = 1;     // month 为1,因为在getMonthWithYear()方法中,month还要进行减 1
            }
        }
    }

12、季度-指定年月所在季度

    /** 12、季度-指定年月所在季度
     * 获取指定年份,指定月份所在季度的开始日期和结束日期,以及所在一年中的第几季度(quarter参数)
     * month参数可以去掉,去掉后就相当于求 当前时间的指定年份所在季度的开始和结束日期
     * @param year  指定年份  如:2018
     * @param month 指定月份:如:5(5月)
     * @return Map结果集: {quarterStartDay=20180401, quarterEndDay=20180630}
     */
    public static Map<String, String> getQuarter(int year, int month) {
        Map<String, String> map = new LinkedHashMap<>();
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        calendar.set(Calendar.MONTH, month - 1);  //可去掉,用于求当前时间所在指定年份的 季度日期
        int m = calendar.get(Calendar.MONTH);
        int quarter = 0;
        if (m >= 0 && m <= 2) {
            quarter = 1;      // 月份所在第几季度
            map = getQuarterStartDayOrEndDay(quarter, year, format);
        } else if (m >= 3 && m <= 5) {
            quarter = 2;
            map = getQuarterStartDayOrEndDay(quarter, year, format);
        } else if (m >= 6 && m <= 8) {
            quarter = 3;
            map = getQuarterStartDayOrEndDay(quarter, year, format);
        } else {
            quarter = 4;
            map = getQuarterStartDayOrEndDay(quarter, year, format);
        }
        return map;
    }

    // 附属,求季度开始和结束日期需要用此方法
    public static Map<String, String> getQuarterStartDayOrEndDay(int quarter, int year, SimpleDateFormat format) {
        Map<String, String> map = new LinkedHashMap<>();
        Calendar calendar = Calendar.getInstance();
        //一年有4个季度,而月份是以0为基础,所以季度*3 -3 就是每个季度所在年份对应的数值
        int startMonth = quarter * 3 - 3;
        calendar.set(year, startMonth, 1);
        String quarterStartDay = format.format(calendar.getTime());
        // 求季度结束日期
        calendar.set(Calendar.MONTH, startMonth + 2);
        int endDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        calendar.set(Calendar.DATE, endDay);
        String quarterEndDay = format.format(calendar.getTime());
        map.put("quarterStartDay", quarterStartDay);
        map.put("quarterEndDay", quarterEndDay);
        return map;
    }

13、季度-所有季度日期

    /** 13、季度-所有季度日期
     * 获取指定年份,指定月份,到现在为止,这段时间内季度的开始和结束日期(包括当前时间)
     *
     * @param year  指定年份  如:2018
     * @param month 指定月份:如:5(5月)
     * @return List结果集:举例:当前时间  2019-7-22
     * [{quarterStartDay=20180401, quarterEndDay=20180630}, {quarterStartDay=20180701, quarterEndDay=20180930},
     * {quarterStartDay=20181001, quarterEndDay=20181231}, {quarterStartDay=20190101, quarterEndDay=20190331},
     * {quarterStartDay=20190401, quarterEndDay=20190630}]
     */
    public static List<Map<String, String>> getAllQuarter(int year, int month) {
        List<Map<String, String>> quarterList = new ArrayList<>();
        Date day = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
        String[] date = format.format(day).split("-");
        int nowYear = Integer.parseInt(date[0]);
        int nowMonth = Integer.parseInt(date[1]);
        while (true) {
            quarterList.add(getQuarter(year, month));
            if (year == nowYear && month >= (nowMonth - 3)) {
                return quarterList;
            }
            month = month + 3;
            if (month > 13) {
                year = year + 1;
                month = 1;
            }
        }
    }

结束语:
此文为关于日期的获取对应方法,时间戳的获取方法在博主其他文章,如有需要,请退出此文查看,如果某些地方不对,还希望大家评论,一定回复,希望大家积极探讨。一起在 java的路途走下去。加油!
如有帮助,还请点赞!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值