Java日期类:关于Calendar类的问题

一、Calendar的所用是啥?

Calendar是Java提供的日历类,用来对日期进行操作。其可以与java.util.Date进行相互转化。

二、如何获取Calendar的实例对象?

Calendar是一个抽象类,因此无法通过构造方法来new其本身的对象。但是Calendar提供了几个静态方法来获取其子类对象。获取子类对象的静态方法分别为:

  1. public static Calendar getInstance()
  2. public static Calendar getInstance(TimeZone zone)
  3. public static Calendar getInstance(Locale aLocale)
  4. 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有多个重载的方法,其声明如下:

  1. public void set(int field, int value)
  2. public final void set(int year, int month, int date)
    
  3. public final void set(int year, int month, int date, int hourOfDay, int minute)
    
  4. 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来说,获取某个时间属性的最大值的方法有两个,分别为:

  1. public abstract int getMaximum(int field)
    
  2. public int getActualMaximum(int field) 
    

获取某个时间属性最小值的方法也有两个,分别为:

  1. public abstract int getMinimum(int field)
    
  2. 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));
    }
}

执行结果如下图所示:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值