一、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
对象的各种方法来实现日期、时间的精确定位和调整。