ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # 简介 日历类,可获取日期中指定字段的值 方法: * public static Calendar getInstance() //获取日期对象 * public int get(int field) //获取时间字段值,字段参见帮助文档 * YEAR 年 * MONTH 月,从0开始算起,最大11;0代表1月,11代表12月。 * DATE 天 * HOUR 时 * MINUTE分 * SECOND秒 * DAY_OF_MONTH 月中的天(几号) * public void add(int field,int amount) //指定字段增加某值 * public final void set(int field,int value)//设置指定字段的值 * public final Date getTime() //获取该日历对象转成的日期对象 # Calendar **注意:日历类的月是从0开始算起,0-11** 日历类,可获取日期中指定字段的值 方法: ~~~ * public static Calendar getInstance() //获取日期对象 * public int get(int field) //获取时间字段值,字段参见帮助文档 - YEAR 年 - MONTH 月,从0开始算起,最大11;0代表1月,11代表12月。 - DATE 天 - HOUR 时 - MINUTE分 - SECOND秒 * public void add(int field,int amount) //指定字段增加某值 * public final void set(int field,int value)//设置指定字段的值 * public final Date getTime() //获取该日历对象转成的日期对象 ~~~ ---- 例子: ~~~ Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); //能输出很多,包括时区 System.out.println(c); //修改当前时间为3天后 c.add(Calendar.DATE, 3); //修改当前时间为5小时后 c.add(Calendar.HOUR, 5); //设置时间为2020年5月20日 c.set(Calendar.YEAR, 2020); c.set(Calendar.MONTH, 4); c.set(Calendar.DATE, 20); Date d = c.getTime(); ~~~ **注意:日历类的月是从0开始算起,0-11** ~~~ public static void main(String[] args) throws ParseException { //设置时间 String s = "2018年12月11日"; // 里面的格式化要写对 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日"); Date parse = simpleDateFormat.parse(s); // 获取时间戳 System.out.println(parse.getTime()); System.out.println("--------"); //用日历类设置时间 Calendar c = Calendar.getInstance(); //设置时间为2018年12月1日 c.set(Calendar.YEAR, 2018); c.set(Calendar.MONTH, 12); c.set(Calendar.DATE, 1); Date time = c.getTime(); //获取时间戳 System.out.println(time.getTime()); } ~~~ 输出 ~~~ 1544457600000 -------- 1546333139093 ~~~ # 常用方法 ![](https://box.kancloud.cn/6a516295ab0434bbcd186782e848af8c_856x796.png) ![](https://box.kancloud.cn/4a0f12a4a9ad8dfa9f82c81500e1bef9_860x309.png) # 常用场景 ## 获取今天或者之后多少天的日期 ~~~ Calendar calendar=Calendar.getInstance(); @Test public void getTest(){ calendar.setTime(new Date()); /*获取今天的日期*/ System.out.println("今天的日期是:"+calendar.get(Calendar.DAY_OF_MONTH)); /*获取十天之后的日期*/ calendar.clear();//避免继承当前系统的时间 calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH)+10); System.out.println("十天之后的日期是:"+calendar.get(Calendar.DAY_OF_MONTH)); } ~~~ ## 计算某个月的天数是多少 ~~~ /*计算某一个月的天数是多少*/ public void maxDay(int year,int month){ calendar.clear(); calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH,month-1);//默认1月为0月 int day = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); System.out.println(year+"年"+month+"月"+"的最大天数是:"+day); } @Test public void maxDayTest(){ maxDay(2017,9); } ~~~ ## 计算某一天是该年或该月的第几个星期 ~~~ public void weekNum(int year,int month,int day){ calendar.clear(); calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH,month-1); calendar.set(Calendar.DAY_OF_MONTH, day); /*计算某一天是该年的第几个星期*/ int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR); System.out.println(year+"年"+month+"月"+day+"日是这年中的第"+weekOfYear+"个星期"); /*计算某一天是该月的第几个星期*/ int weekOfMonth= calendar.get(Calendar.WEEK_OF_MONTH); System.out.println(year+"年"+month+"月"+day+"日是这个月中的第"+weekOfMonth+"个星期"); } @Test public void weekNumTest(){ weekNum(2017, 7, 8); } ~~~ ## 计算一年中的第几星期是几号 ~~~ public void dayNum(int year,int week){ calendar.clear(); SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd"); calendar.set(Calendar.YEAR, year); calendar.set(Calendar.WEEK_OF_YEAR, week); calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); System.out.println(df.format(calendar.getTime())); } @Test public void dayNumTest(){ dayNum(2017,28); } ~~~ ## 查询显示当前的后几天,前几天等 ~~~ public void add(int year,int month,int day,int num){ calendar.clear(); SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd"); calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, month-1); calendar.set(Calendar.DAY_OF_MONTH, day); Date date=calendar.getTime(); calendar.add(Calendar.DATE, num); date=calendar.getTime(); System.out.println(df.format(date)); } /*使用场景比如,发找回密码邮件,设置一天后过期*/ @Test public void addTest(){ add(2017,7,10,1); } ~~~ roll()方法和add()方法用法一样,不过roll()方法是在本月循环,比如,七月三十一号加五天,add()方法结果是八月五号; roll()方法是七月五号,roll()方法用到的少,一般add()使用较多。测试roll()方法: ~~~ public void roll(int year,int month,int day,int num){ calendar.clear(); SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd"); calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, month-1); calendar.set(Calendar.DAY_OF_MONTH, day); Date date=calendar.getTime(); calendar.roll(Calendar.DATE, num); date=calendar.getTime(); System.out.println(df.format(date)); } @Test public void rollTest(){ roll(2017,7,31,5); } ~~~ ## 计算两个任意时间中间相隔的天数 ~~~ public int getDaysBetween (Calendar day1, Calendar day2){ if (day1.after(day2)){ Calendar swap = day1; day1 = day2; day2 = swap; } int days = day2.get(Calendar.DAY_OF_YEAR) - day1.get(Calendar.DAY_OF_YEAR); int y2 = day2.get(Calendar.YEAR); if (day1.get(Calendar.YEAR) != y2){ day1 = (Calendar) day1.clone(); do{ days += day1.getActualMaximum(Calendar.DAY_OF_YEAR);//得到当年的实际天数 day1.add(Calendar.YEAR, 1); } while (day1.get(Calendar.YEAR) != y2); } return days; } @Test public void getDaysBetweenTest(){ Calendar calendar1=Calendar.getInstance(); Calendar calendar2=Calendar.getInstance(); calendar1.set(2017,07,30); calendar2.set(2017,07,03); int days=getDaysBetween(calendar1, calendar2); System.out.println("相隔"+days+"天"); } ~~~ 计算任意两个日期的相隔天数使用场景较多,如查询某个时间段注册的新用户,或者某个时间段内销售总额等等