Calendar.getInstance详解

发布时间:2023-05-18

一、calendar.getInstance()

Calendar 类是一个抽象类,不能直接使用它的构造方法来创建对象。可以通过 getInstance() 方法得到一个 Calendar 对象,getInstance() 是一个静态方法:

Calendar calendar = Calendar.getInstance();

getInstance() 方法默认获取当前时区的 Calendar 对象,我们也可以传入指定 TimeZone 参数来获取特定时区的对象:

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Europe/Paris"));

此时创建出来的 Calendar 对象表示的是当地时间,而不是当前的系统时间。

二、calendar.getInstance().setTime()

Calendar 对象实例化之后默认表示当前时间,可以通过 setTime(Date date) 方法来设置 Calendar 对象的时间。例如,将 Calendar 对象的时间设置为 2018 年 10 月 1 日下午 3 点 10 分:

Calendar calendar = Calendar.getInstance();
calendar.set(2018, Calendar.OCTOBER, 1, 15, 10);

上述代码等价于:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, 2018);
calendar.set(Calendar.MONTH, Calendar.OCTOBER);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.HOUR_OF_DAY, 15);
calendar.set(Calendar.MINUTE, 10);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);

三、calendar.getInstance 报错

当我们调用 getInstance() 方法创建 Calendar 对象之后,可能会出现时间不准确的情况,这时候我们就需要使用振铃(revalidate)或者 updateTimeMillis 来使其重新校准时间。例如:

Calendar calendar = Calendar.getInstance();
calendar.set(2021, Calendar.JANUARY, 1, 0, 0, 0);
calendar.set(Calendar.MILLISECOND, 0);
long time = calendar.getTimeInMillis();
// 运行一段时间后,重新振铃。此时,Calendar对象的时间会被重新校准。
calendar.setTimeInMillis(time);
calendar.set(Calendar.HOUR_OF_DAY, 1);
System.out.println(calendar.getTime());

四、calendar.getInstance 方法

getInstance() 方法调用其实是自动识别时区入口,所以其是可以在同一台机器的不同时区之间切换的。

五、calendar.getInstance().add()

Calendar 对象添加或减少某个时间段的方法有 add()roll()add() 方法在指定的时间单元上加上或减去指定的值,例如将 Calendar 对象的时间加 1 天:

Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, 1);

如果此时 Calendar 对象的日期已经到下个月,那么月份也会相应地增加。

六、Calendar.getInstance 效率高吗

Calendar.getInstance() 方法是 Java 提供的获取当前日期和时间的最常用方法之一。它的效率是非常高的,因为只创建了一个 Calendar 对象来处理所有的日期和时间信息。 当然,如果在循环中频繁地调用 getInstance() 方法,或在多线程环境下使用该方法,则需要进行相应的性能优化。

七、总结

Calendar.getInstance() 方法是获取当前时间的最简单、最常用的方法之一,它可以让我们很方便地处理日期和时间相关的业务逻辑。我们可以利用 Calendar 对象的各种方法来实现日期、时间的精确定位和调整。