Java 日期和时间(二)Calendar、GregorianCalendar、TimeZone等

上一期我们说了 System.currentTimeMillis()Date类,这期我们聊聊 CalendarGregorianCalendarTimeZone

一、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_MONTHAM_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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

timi先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值