目录
上一期我们说了 System.currentTimeMillis()和Date类,这期我们聊聊 Calendar、GregorianCalendar和TimeZone
一、java.util.Calendar
1.1 使用场景
java.util.Calendar
类用于进行日期和时间计算。如果有比仅表示日期和时间更复杂的场景时,就可以使用这个类。
java.util.Calendar是抽象的,所以无法实例化它,它抽象的原因是世界上不止一种日历~
1.2 GregorianCalendar 实例化
Java 只有一种公历的实现类:java.util.GregorianCalendar
,它的实例化可以这样:
Calendar calendar = new GregorianCalendar();
1.3 Calendar类的 年、月、日
Calendar如何访问给定日期的年、月、日、小时、分钟、秒、毫秒和时区呢,可以参考下面示例:
Calendar calendar = new GregorianCalendar();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // 一月是从0开始的,这里需要注意
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);
int weekOfMonth= calendar.get(Calendar.WEEK_OF_MONTH);
int hour = calendar.get(Calendar.HOUR); // 12小时制
int hourOfDay = calendar.get(Calendar.HOUR_OF_DAY); // 24小时制
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
int millisecond= calendar.get(Calendar.MILLISECOND);
Calendar类换包括一些不常用的字段,例如:DAY_OF_WEEK_IN_MONTH 和AM_PM等
除了获取字段之外,Calendar 类还提供了set()方法来设置字段:
Calendar calendar = new GregorianCalendar();
calendar.set(Calendar.YEAR, 2009);
calendar.set(Calendar.MONTH, 11); // 11 这里指12月
calendar.set(Calendar.DAY_OF_MONTH, 24);
1.4 年、月、日等时间的加减
Calendar类还提供了时间日期的加减计算:
Calendar calendar = new GregorianCalendar();
//将日期设置为 2022年的最后一天
calendar.set(Calendar.YEAR, 2022);
calendar.set(Calendar.MONTH, 11); // 12月
calendar.set(Calendar.DAY_OF_MONTH, 31); //新年
//加一天
calendar.add(Calendar.DAY_OF_MONTH, 1);
//现在时间是2023年的第一天
int year = calendar.get(Calendar.YEAR); // 现在是2023年
int month = calendar.get(Calendar.MONTH); // 一月份
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // 第一天
add() 在进行日期运算时十分简便,要加时间就给它正值,要减去就给它负值,举个例子:
//减去一天
calendar.add(Calendar.DAY_OF_MONTH, -1);
//加上一天
calendar.add(Calendar.DAY_OF_MONTH, 1);
1.5 需要注意的部分和陷阱
1.5.1 月份
Calendar类的MONTH字段不会像我们以其他方式编写日期时那样从 1 到 12。相反,月份从 0 到 11,其中 0 是 1 月,11 是 12 月。
1.5.2 星期
Calendar类计算星期是从星期日开始,就是说 1-星期日,2-星期一 …7-星期六。
二、java.util.TimeZone
2.1 使用场景
TimeZone 类是表示时区的类,在跨时区进行日历计算时很有帮助。java.util.TimeZone
类一般和 java.util.Calendar
类结合使用
2.2 从Calendar 获取时区
获取时区:
Calendar calendar = new GregorianCalendar();
TimeZone timeZone = calendar.getTimeZone();
设置时区:
calendar.setTimeZone(timeZone);
2.3 时区示例创建
创建时区有两种方法。
第一种时从系统中获取:
TimeZone timeZone = TimeZone.getDefault();
第二种给定时区 ID :
TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai");
2.4 时区名称、ID 和偏移量
查看给定时区的显示名称、ID 和时间偏移量:
timeZone.getDisplayName();
timeZone.getID();
timeZone.getOffset( System.currentTimeMillis() );
getOffset()方法返回给定时间的给定时区与 UTC 的偏移量(以毫秒为单位)。
2.5 时区之间的转换
Calendar类支持不同时区的时间转换:
TimeZone timeZone1 = TimeZone.getTimeZone("Asia/Shanghai");
TimeZone timeZone2 = TimeZone.getTimeZone("Europe/Copenhagen");
Calendar calendar = new GregorianCalendar();
long timeCPH = calendar.getTimeInMillis