文章目录
一、Calendar 日历类
java.util.Calendar
是从 JDK1.1 就推出的支持日期处理的工具类,它本身是一个抽象类,提供了许多可以进行日期操作的变量与方法。
源码中的介绍【译】:
Calendar类是一个抽象类,它提供了一些方法,用于在特定的时间瞬间和一组日历字段(例如年、月、月的第几天、小时等)之间进行转换,并用于操作日历字段(例如获取下周的日期)。时间上的一个瞬间可以用毫秒值表示,毫秒值是从1970年1月1日00:00:00.000 GMT(公历)开始的偏移量。
该类还提供了额外的字段和方法,用于在包外实现具体的日历系统。这些字段和方法被定义为受保护。
与其他区域设置敏感类一样,Calendar提供了一个类方法getInstance,用于获取这种类型的常用对象。Calendar的getInstance方法返回一个日历对象,其日历字段已用当前日期和时间初始化:
Calendar中定义的表示时间的常量 private final static int(部分):
属性 | 值 | 描述 |
---|---|---|
YEAR | 1 | 年,1970~至今 |
MONTH | 2 | 月,1~12 |
DAY_OF_MONTH | 5 | 本月的日,从0开始,0~30 |
DAY_OF_YEAR | 6 | 本年的天,从1月1开始,1~366 |
DAY_OF_WEEK | 7 | 本星期的日,从星期天为1开始,1~7 |
HOUR | 10 | 当前小时(12小时制)0~11 |
HOUR_OF_DAY | 11 | 当前小时(24小时制)0~23 |
MINUTE | 12 | 当前的分钟 0~59 |
SECOND | 13 | 当前的秒 0~59 |
MILLISECOND | 14 | 当前的毫秒 0~999 |
更多表示时间的常量属性可通过 JDK 源码 java.util.Calendar
查看
1.1 内部属性
private long instant; // 当前时间戳
private int[] fields; // Calendar.stamp[] (下半部分) 和 Calendar.fields[] (上半部分) 组合
// 从最小用户戳 MINIMUM_USER_STAMP 开始的伪时间戳。
private int nextStamp; // (计算用于指示已设置瞬间。)
private int maxFieldIndex; // 保留已设置字段的最大索引(不包括week和year)。
private String type; // 日历类型, 支持 gregory、iso8601、buddhist、japanese 四种类型
private TimeZone zone; // 时区
private boolean lenient = true; // 表示日历是否宽松
private Locale locale; // 表示日历语言, 默认为 en
private int firstDayOfWeek, minimalDaysInFirstWeek;
// firstDayOfWeek 设置星期中第几天是第一天, 默认为0,即星期天
// minimalDaysInFirstWeek 设置一年中第一周所需的最少天数, 默认是1
// 1 --> 第一周定义为包含一年中第一个月的第一天
// 7 --> 如果必须是一整周
1.2 设置时间属性值
Calendar 类中一共提供了16个set方法,用于设置类的一些属性,这里列举几个常见的:
public void set(int field, int value){
}
public final void set(int year, int month, int date){
}
public final void set(int year, int month, int date, int hourOfDay, int minute){
}
public final void set(int year, int month, int date, int hourOfDay, int minute,
int second){
}
public void setTimeZone(TimeZone value){
}
public void setFirstDayOfWeek(int value){
}
【例】修改当前的星期
import java.util.Calendar;
public class Demo {
public static void println(Object o){
System.out.println(o); }
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
println("当前时间:" + calendar.getTime());
println("当前星期: " + calendar.get(Calendar.DAY_OF_WEEK));
println("修改星期为星期日(1)");
calendar.set(Calendar.DAY_OF_WEEK, 1);
println("修改后的时间: " + calendar.getTime());
println("修改后的星期: " + calendar.get(Calendar.DAY_OF_WEEK));
}
}
运行结果
当前时间:Wed Jul 20 09:26:48 CST 2022
当前星期: 4
修改星期为星期日(1)
修改后的时间: Sun Jul 17 09:26:48 CST 2022
修改后的星期: 1
可以看到,如果只修改其中一个属性,那么就会修改为最接近的时间属性,而其他属性不会发生变化。
1.3 获取时间属性
public int get(int field){
}
【例】获取当前时间的一些属性
import java.util.Calendar;
public class Demo {
public static void println(Object o){
System.out.println(o); }
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
println("默认时区: " + calendar.getTimeZone());
println("当前时间:" + calendar.getTime());
println("日历类型: " + calendar.getCalendarType());
println("当前年份: " + calendar.get(Calendar.YEAR));
println("当前月份: " + calendar.get(Calendar.MONTH));
println("当前日期: " + calendar.get(Calendar.DATE));
println("当天是今年的第几个星期: " + calendar.get(Calendar.WEEK_OF_YEAR));
println("当天是本月的第几个星期: " + calendar.get(Calendar.WEEK_OF_MONTH));
println("当天是今年中的第几天: " + calendar.get(Calendar.DAY_OF_YEAR));
println("当天是本月的第几天: " + calendar.get(Calendar.DAY_OF_MONTH));
println