前言:
你之所以会觉得难受,大概是因为你投入了大把时间和精力,到最后却没能得到你想要的东西,那种一瞬间被失落灌满的样子让你感到不值得。
我们上一篇聊到了java之Date和SimpleDateFormat处理时间类,这一篇我们聊一下Calender类,针对于以下的概念,都会有实体例子配合着,给大家演示,希望给历险中的你带来一些帮助!!!
一.介绍
我们可以使用Date来取得完整的日期时间显示,但如果您想要单独取得某个时间或日期资讯的话该如何?
这个时候我们要使用Calendar日历类别,使用之前,您要先知道Calendar的一些方法取回的数字是对应于Calendar本身的常数,也就是说并不是您取回1 这个数字,就表示今天是星期一。
二.知识点介绍
1、概念
2、常见方法
3、注意
4、calendar类中常用方法
5、精炼练习
三.知识点讲解
1、概念
Calendar是日历类,在Date后出现,替换掉了许多Date的方法。该类将所有可能用到的时间信息封装为字段值,方便获取。
Calendar为抽象类,由于语言敏感性,Calendar类在创建对象时并非直接创建,而是通过静态方法创建,将语言敏感内容处理好,再返回子类对象,如下:
Calendar类静态方法:static Calendar getInstance():使用默认时区和语言环境获得一个日历。
Calendar c = Calendar.getInstance(); //返回当前日历对象
public static String cal(){
Calendar b= new GregorianCalendar();
return b.toString();
}
2、常见方法
(1)public static Calendar getInstance():获取日期对象
(2)public int get(int field):获取时间字段值,字段参见帮助文档
YEAR: 年
MONTH :月,从0开始算起,最大11;0代表1月,11代表12月。
DATE: 天
HOUR:时
MINUTE:分
SECOND:秒
(3)public void add(int field,int amount):指定字段增加某值
(4)public final void set(int year,intmonth,int date):设置年月日,可查看对应重载
(5)public final Date getTime():获取该日历对象转成的日期对象
代码演示:
package com.Test;
import Test2.MyDate;
import java.awt.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class Main {
private final static String name = "磊哥的java历险记-@51博客";
/*
*Calendar
*public static Calendar getInstance()
*Calendar rightNow = Calendar.getInstance()
*public int get(int field)
*public void add(int field,int amount)
*public final void set(int year,int month,int date)
*public final Date getTime()
*/
public static void main(String[] args) {
//获取日期对象
Calendar rightNow = Calendar.getInstance();
System.out.println("日期对象:"+rightNow);
//获取时间字段值,字段参见帮助文档
int i = rightNow.get(Calendar.YEAR);
System.out.println("年:"+i);
System.out.println("月:"+rightNow.get(Calendar.MONTH+1));
System.out.println("天:"+rightNow.get(Calendar.DATE));
System.out.println("今天是这月的第几天:"+rightNow.get(Calendar.DAY_OF_MONTH));
//给指定年份 减1
rightNow.add(Calendar.YEAR,-1);
int year = rightNow.get(Calendar.YEAR);
System.out.println("年份减一:"+year);
//指定年份,月份,天
rightNow.set(2017,9, 10);
System.out.println("指定年:"+rightNow.get(Calendar.YEAR));
System.out.println("指定月:"+rightNow.get(Calendar.MONTH));
System.out.println("指定天:"+rightNow.get(Calendar.DATE));
//日历对象获取毫秒值
long time = rightNow.getTime().getTime();
long timeInMillis = rightNow.getTimeInMillis();
System.out.println("时间戳:"+time);
System.out.println("时间戳:"+timeInMillis);
System.out.println("============="+name+"=============");
}
}
3、注意
(1)西方星期的开始为周日,中国为周一。
(2)在Calendar类中,月份的表示是以0-11代表1-12。
(3)日期是有大小关系的,时间靠后,时间越大。
4、Calendar类中的方法
由 Calendar 定义的一些常用方法如下表所示:
代码演示:
时间类:
package Test2;
//导入时间包
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class MyDate {
private final static String name = "磊哥的java历险记-@51博客";
public MyDate(){
}
// 当天
public String getThisToday() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-ddHH:mm:ss"); //时间的格式化
Calendar cal = Calendar.getInstance(); //类的实例化
//当天的开始时间,这里之所以三个分开设置,是因为Calendar已经存在日期
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
//第一个时间格式化
String start = sdf.format(cal.getTime());
//当天的结束时间
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
//第二个时间格式化
String end = sdf.format(cal.getTime());
return start + "|" + end;
}
// 本周
public String getThisWeekDate() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-ddHH:mm:ss");
Calendar ca = Calendar.getInstance();
//设定每周第一天是星期一(也可以是星期日)
ca.setFirstDayOfWeek(Calendar.MONDAY);
//获取星期日的日期,具体时间为当前时间
ca.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
//设置周日结束时间(此处也可如上面那样设置时分秒即可)
ca.set(ca.get(Calendar.YEAR), ca.get(Calendar.MONTH),ca.get(Calendar.DATE), 23, 59, 59);
String end = sdf.format(ca.getTime());
//获取周一的日期
ca.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
ca.set(Calendar.HOUR_OF_DAY, 0);
ca.set(Calendar.MINUTE, 0);
ca.set(Calendar.SECOND, 0);
String start = sdf.format(ca.getTime());
return start + "|" + end;
}
// 本月日期段
public String getThisMonthDate() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-ddHH:mm:ss");
Calendar cc2 = Calendar.getInstance();
//获取当月DAY最大值
int maxMonthDay = cc2.getActualMaximum(Calendar.DAY_OF_MONTH);
cc2.set(cc2.get(Calendar.YEAR),cc2.get(Calendar.MONTH),maxMonthDay, 23, 59, 59);
/*
* add函数可以增加某一字段,并且会自动调节,例如当前为2016年12月31号,增加两个月会自动缩短天数为28,
* 天数增加超过当前最大值就会自动进一位到月份
*/
//cc2.add(Calendar.DAY_OF_MONTH, 2);
//roll函数可以设置当前field,超过时只会循环,不会进一位
//cc2.roll(Calendar.MONTH, 13);
/*
* getMaximum函数得到的每个月天数都是31,而getActualMaximum函数得到的则是每个月的实际天数
* 实际上就是前者返回给定日历的最大值,后者返回给定日历对应时间的最大值(最小值同理)
* 例如2017年2月20号,前者就会取2017年日历中月份的最大天数31,而后者则会取当月最大天数28。
* 因为每个月最小值都是1,所以这种情况下最小值都是相等。
*/
// for(int i=0;i<11;i++){
// cc2.add(Calendar.MONTH, 1);
// System.out.println(cc2.getMaximum(Calendar.DAY_OF_MONTH)+"------"+cc2.getActualMaximum(Calendar.DAY_OF_MONTH));
// }
//System.out.println(cc2.getActualMinimum(Calendar.DAY_OF_WEEK)+"--------"+cc2.getMinimum(Calendar.DAY_OF_WEEK));
//也可以通过毫秒数设定时间
// cc2.setTimeInMillis(new Date().getTime());
// System.out.println(cc2.get(Calendar.MONTH));
String end = sdf.format(cc2.getTime());
cc2.set(cc2.get(Calendar.YEAR), cc2.get(Calendar.MONTH), 1, 0,0, 0);
String start = sdf.format(cc2.getTime());
return start + "|" + end;
}
}
主方法调用:
package com.Test;
import Test2.MyDate;
import java.awt.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class Main {
private final static String name = "磊哥的java历险记-@51博客";
public static void main(String[] args) {
MyDate myDate = new MyDate();
String monthDate = myDate.getThisMonthDate();
String today = myDate.getThisToday();
String weekDate = myDate.getThisWeekDate();
System.out.println("monthDate:"+monthDate);
System.out.println("today:"+today);
System.out.println("weekDate:"+weekDate);
System.out.println("============="+name+"=============");
}
}
5、精炼练习:
5.1 题目
(1)获取到2018-06的最后一天。
(2)比较2018-06-26和2017-08-26谁大
5.2 实验步骤
(1)使用getActualMaximum()获取最后一天或者shiy哦那个roll()获取
(2)使用compareTo进行时间比较。
代码演示:
package com.Test;
import Test2.MyDate;
import java.awt.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class Main {
private final static String name = "磊哥的java历险记-@51博客";
public static void main(String[] args) throws ParseException {
//方法1利用getActualMaximum
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
//calendar设置时间
calendar.setTime(sdf.parse("2018-06-26"));
//这里的getMaximum不会被calendar.setTime所影响,因为它只识别当月的。而getActualMaximum则会是canlender的设置的。
System.out.println(calendar.getMaximum(Calendar.DAY_OF_MONTH));
System.out.println(calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
//方法2利用roll
calendar.roll(Calendar.DAY_OF_MONTH,-1);
System.out.println(sdf.format(calendar.getTime()));
//比较大小
//claendarNew设置时间
Calendar calendarNew = Calendar.getInstance();
calendarNew.setTime(sdf.parse("2018-08-27"));
//calender的时间比较用compareTo 大于0表示前者大于后者 小于0表示前者小于后者 等于0表示两者相等
int result = calendarNew.compareTo(calendar);
if(result > 0 ){
System.out.println("2018-06-26<2018-08-26");
}else if(result < 0){
System.out.println("2018-06-26>2018-08-26");
}else{
System.out.println("2018-06-26=2018-08-26");
}
System.out.println("============="+name+"=============");
}
}
结语:
没有太晚的开始,不如就从今天行动。总有一天,那个一点一点可见的未来,会在你心里,也在你的脚下慢慢清透。生活,从不亏待每一个努力向上的人。
我会沿着java基础至中阶,高阶,和后面的实战项目,循序渐进,由浅入深,希望能够帮助看到我文章的兄弟们,特别是初学者!
感谢大家持续关注!