Calendar
简介
- Calendar:它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
- Java官方推荐使用Calendar来替换Date的使用
Calendar类的实例
该类是一个被abstract修饰的抽象类,且构造方法被protected修饰,因此不能直接通过new创建对象,而是通过静态方法创建,返回一个Calendar对象(该对象为Calendar的子类对象)
Calendar calendar=Calendar.getInstance();
getInstance的具体实现,使用默认时区和指定语言环境的日历。 该Calendar返回是基于给定语言环境的默认时区的当前时间。
public static Calendar getInstance()
{
return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT));
}
private static Calendar createCalendar(TimeZone zone,
Locale aLocale)
{
CalendarProvider provider =
LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale)
.getCalendarProvider();
if (provider != null) {
try {
return provider.getInstance(zone, aLocale);
} catch (IllegalArgumentException iae) {
// fall back to the default instantiation
}
}
Calendar cal = null;
if (aLocale.hasExtensions()) {
String caltype = aLocale.getUnicodeLocaleType("ca");
if (caltype != null) {
switch (caltype) {
case "buddhist":
cal = new BuddhistCalendar(zone, aLocale);
break;
case "japanese":
cal = new JapaneseImperialCalendar(zone, aLocale);
break;
case "gregory":
cal = new GregorianCalendar(zone, aLocale);
break;
}
}
}
if (cal == null) {
// If no known calendar type is explicitly specified,
// perform the traditional way to create a Calendar:
// create a BuddhistCalendar for th_TH locale,
// a JapaneseImperialCalendar for ja_JP_JP locale, or
// a GregorianCalendar for any other locales.
// NOTE: The language, country and variant strings are interned.
if (aLocale.getLanguage() == "th" && aLocale.getCountry() == "TH") {
cal = new BuddhistCalendar(zone, aLocale);
} else if (aLocale.getVariant() == "JP" && aLocale.getLanguage() == "ja"
&& aLocale.getCountry() == "JP") {
cal = new JapaneseImperialCalendar(zone, aLocale);
} else {
cal = new GregorianCalendar(zone, aLocale);
}
}
return cal;
}
为什么说返回的是Calendar的子类对象呢,因为每个国家地区都有自己的一套日历算法,比如西方国家的第一个星期大部分为星期日,而中国则为星期一。
常用方法
- abstract void add(int field, int amount) 根据日历的规则,为给定的日历字段添加或减去指定的时间量。
- boolean after(Object when) 判断此 Calendar 表示的时间是否在指定 Object 表示的时间之后,返回判断结果。
- boolean before(Object when) 判断此 Calendar 表示的时间是否在指定 Object 表示的时间之前,返回判断结果。
- void clear() 将此 Calendar 的所日历字段值和时间值(从历元至现在的毫秒偏移量)设置成未定义
- void clear(int field) 将此 Calendar 的给定日历字段值和时间值(从历元至现在的毫秒偏移量)设置成未定义。
- int get(int field) 返回给定日历字段的值。
- Date getTime() 返回一个表示此 Calendar 时间值(从历元至现在的毫秒偏移量)的 Date 对象。
- void setTime(Date date) 使用给定的 Date 设置此 Calendar 的时间。
- abstract void roll(int field, boolean up) 在给定的时间字段上添加或减去(上/下)单个时间单元,不更改更大的字段。
- void roll(int field, int amount) 向指定日历字段添加指定(有符号的)时间量,不更改更大的字段。
- void set(int field, int value) 将给定的日历字段设置为给定值。
- void set(int year, int month, int date) 设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值。
- void set(int year, int month, int date, int hourOfDay, int minute) 设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值。
- void set(int year, int month, int date, int hourOfDay, int minute, int second) 设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值。
实例
//获取Calendar对象
Calendar calendar=Calendar.getInstance();
//获取年
int year=calendar.get(Calendar.YEAR);
//获取月,这是获取的月份需要+1才是当月的日期值
int month=calendar.get(Calendar.MONTH)+1;
//获取日
int day=calendar.get(Calendar.DAY_OF_MONTH);
//获取时
int hour=calendar.get(Calendar.HOUR); //Calendar.HOUR_OF_DAY // 24小时表示
//获取分
int minute=calendar.get(Calendar.MINUTE);
//获取秒
int second=calendar.get(Calendar.SECOND);
System.out.println(year+"年"+month+"月"+day+"日"+hour+"时"+minute+"分"+second+"秒");
System.out.println(calendar.getTimeZone());//获取时区
System.out.println(calendar.getTime());//获取当前时间(Date类型)
//获取当前时间的前**/年/月/日
Calendar ca = Calendar.getInstance();// 得到一个Calendar的实例
ca.setTime(new Date()); // 设置时间为当前时间
ca.add(Calendar.MONTH, -5);// 月份减1
Date resultDate = ca.getTime(); // 结果
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("当前时间的前五个月的日期"+sdf.format(resultDate));
打印结果
2020年7月27日6时10分48秒
sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null]
Mon Jul 27 18:10:48 CST 2020
当前时间的前五个月的日期2020-02-27 18:10:48