Calendar类日常使用

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));

打印结果

202072761048秒
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值