一、Calendar的所用是啥?
Calendar是Java提供的日历类,用来对日期进行操作。其可以与java.util.Date进行相互转化。
二、如何获取Calendar的实例对象?
Calendar是一个抽象类,因此无法通过构造方法来new其本身的对象。但是Calendar提供了几个静态方法来获取其子类对象。获取子类对象的静态方法分别为:
-
public static Calendar getInstance()
-
public static Calendar getInstance(TimeZone zone)
-
public static Calendar getInstance(Locale aLocale)
-
public static Calendar getInstance(TimeZone zone, Locale aLocale)类对象。
默认情况下获取的子类对象为:GregorianCalendar类。
三、如何通过Calendar获取所有可用的本地语言环境?
Calendar类有一个静态方法:
public static synchronized Locale[] getAvailableLocales()
通过该方法会获取一个Calendar可用的本地语言环境数组。
四、如何通过Calendar获取所有可用的日历类型?
Calendar类有一个静态方法:
public static Set<String> getAvailableCalendarTypes()
通过该方法会获取到Calendar所有可用的日历类型的Set。
五、如何通过Calendar对象获取对应的java.util.Date对象?
通过Calendar的getTime获取。getTime的声明如下:
public final Date getTime()
示例代码如下所示:
public class CalendarTest {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
Date date = cal.getTime();
}
}
六、如何通过java.util.Date对象获取一个Calendar对象?
我们可以先通过Calendar类的静态方法获取其子类对象,接着调用子类对象的setTime来接受java.util.Date的对象。
Calendar对象的setTime方法声明如下:
public final void setTime(Date date)
示例代码如下所示:
public class CalendarTest {
public static void main(String[] args) {
Date date = new Date(0);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
}
}
七、如何通过Calendar对象获取当前时间(距1970年1月1日0时0分0秒过去的毫秒数)?
可以通过Calendar子类对象的getTimeInMillis()。getTimeInMillis的声明如下:
public long getTimeInMillis()
示例代码如下所示:
public class CalendarTest {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
long millis = cal.getTimeInMillis();
}
}
当然,Calendar对象还有一个setTimeInMillis的方法,通过该方法可以修改Calendar对象表示的时间。setTimeInMillis的声明如下:
public void setTimeInMillis(long millis)
八、如何通过Calendar获取当前的年、月、日、时、分、秒、毫秒?
首先我们需要先获取一个Calendar对象,通过调用起get方法来获取。get方法的声明如下:
public int get(int field)
入参为Calendar定义的常量值,常用的有:
年:Calendar.YEAR
月:Calendar.MONTH
日:Calendar.DATE
时:Calendar.HOUR
分:Calendar.MINUTE
秒:Calendar.SECOND
毫秒:Calendar.MILLISECOND
当然,Calendar提供的常量值不止这些,这些只是常用的罢了。
下面是相关的示例代码:
public class CalendarTest {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
// 获取年
int year = cal.get(Calendar.YEAR);
// 获取月
int month = cal.get(Calendar.MONTH);
// 获取日
int date = cal.get(Calendar.DATE);
// 获取时
int hour = cal.get(Calendar.HOUR);
// 获取分
int minute = cal.get(Calendar.MINUTE);
// 获取秒
int second = cal.get(Calendar.SECOND);
// 获取毫秒
int milliSecond = cal.get(Calendar.MILLISECOND);
}
}
需要说明一点地的是,Calendar获取的月是0-11,也就是说为0时表示1月。
九、如何修改Calendar对象表示的年、月、日、时、分、秒属性值?
对于Calendar对象来说,可以通过set方法来修改其年、月、日、时、分、秒等值、set有多个重载的方法,其声明如下:
-
public void set(int field, int value)
-
public final void set(int year, int month, int date)
-
public final void set(int year, int month, int date, int hourOfDay, int minute)
-
public final void set(int year, int month, int date, int hourOfDay, int minute,int second)
关于set的使用的示例代码如下所示:
public class CalendarTest {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
// 仅设置某个属性,如:年、月等
cal.set(Calendar.YEAR, 2010);
// 同时设置年、月、日
cal.set(2012, 12, 1);
// 同时设置年、月、日、时、分
cal.set(2011, 10, 1, 4, 5);
// 同时设置年、月、日、时、分、秒
cal.set(2008, 12, 10, 4, 5, 12);
}
}
十、如何比较两个Calendar对象的大小。
对于Calendar对象来说,比较大小的方法有:before和after两个。before表示调用的Calendar对象是否在传入的Calendar对象之前,而after则表示调用的Calendar对象是否在传入的Calendar对象之后。
before的声明如下:
public boolean before(Object when)
after的声明如下:
public boolean after(Object when)
使用的相关示例代码如下所示:
public class CalendarTest {
public static void main(String[] args) {
// cal表示当前时间
Calendar cal = Calendar.getInstance();
// cal2表示时间原点
Calendar cal2 = Calendar.getInstance();
cal2.setTimeInMillis(0);
System.out.println(cal.before(cal2));
System.out.println(cal.after(cal2));
}
}
执行结果如下图所示:
十一、如何对某个时间属性进行加或减?
对于Calendar对象来说,增或减都使用的同一个方法:add或roll。当数值为正时表示加,数值为负时表示减。
add方法的声明如下:
public abstract void add(int field, int amount)
roll方法的声明如下:
public void roll(int field, int amount)
示例代码如下所示:
public class CalendarTest {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
cal.set(2020, 5, 21,12, 12, 50);
// 此时Calendar对象表示的时间
System.out.println("初始时间为:" + sdf.format(cal.getTime()));
// 使用add方法对秒加20
cal.add(Calendar.SECOND, 20);
System.out.println("增加20秒后结果为:" + sdf.format(cal.getTime()));
Calendar cal2 = Calendar.getInstance();
cal2.set(2020, 5, 21,12, 12, 50);
// 此时Calendar对象表示的时间
System.out.println("初始时间为:" + sdf.format(cal2.getTime()));
// 使用roll方法对秒加20
cal2.roll(Calendar.SECOND, 20);
System.out.println("增加20秒后结果为:" + sdf.format(cal2.getTime()));
}
执行结果如下所示:
从结果我们可以发现,虽然add和roll方法都可以用来对Calendar表示的时间的某个属性进行增加减少,区别在于add超出表示范围后会发生进位处理,而roll方法则不会。
十二、如何获取Calendar表示时间属性的最大值或最小值?
对于Calendar来说,获取某个时间属性的最大值的方法有两个,分别为:
-
public abstract int getMaximum(int field)
-
public int getActualMaximum(int field)
获取某个时间属性最小值的方法也有两个,分别为:
-
public abstract int getMinimum(int field)
-
public int getActualMaximum(int field)
其中getMaximum和getMinimum获取的是当前时间属性所能允许的最大和最小值。而getActualMaximum和getActualMinimum获取得则是真正的最大值和最小值。比如对于月份来说,每个月的最大天数和最小天数是不一样的。
关于获取Calendar对象最大值和最小值的示例代码如下所示:
public class CalendarTest {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
// 月份是从0开始的,3表示4月
cal.set(Calendar.MONTH, 3);
// 获取所能允许的最大值和最小值
System.out.println("所能允许的最大值为:" + cal.getMaximum(Calendar.DATE));
System.out.println("所能允许的最小值为:" + cal.getMinimum(Calendar.DATE));
// 获取真正的最大值和最小值
System.out.println("真正的最大值为:" + cal.getActualMaximum(Calendar.DATE));
System.out.println("真正的最小值为:" + cal.getActualMinimum(Calendar.DATE));
}
}
执行结果如下图所示: