一 概述
Calendar 类是一个抽象类(Calendar类不能直接创建实例),它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下个星期的日期)提供了一些方法;瞬间可用毫秒值来表示,它是距历(格林威治时间1970年1月1日的00:00:00.000)的偏移量。
二 使用
Calendar类如果要创建实例,必须通过getInstance方法构造Calendar的子类对象
1 获取时间
// 使用默认时区和语言环境获得一个日历
Calendar cal = Calendar.getInstance()
// 赋值时年月日时分秒常用的6个值,注意月份下标从0开始,所以取月份要+1
System.out.println("年:" + cal.get(Calendar.YEAR));
System.out.println("月:" + (cal.get(Calendar.MONTH) + 1));
System.out.println("日:" + cal.get(Calendar.DAY_OF_MONTH));
System.out.println("时:" + cal.get(Calendar.HOUR_OF_DAY));
System.out.println("分:" + cal.get(Calendar.MINUTE));
System.out.println("秒:" + cal.get(Calendar.SECOND));
年:2018
月:2
日:12
时:15
分:57
秒:39
二 设置时间
月份的下标从 0 开始,设置时同样需要注意,比如我们设置为 2 月 15 日除夕当晚的倒计时的最后一秒: 2018-02-15 23:59:59可以这样:
Calendar cal = Calendar.getInstance();
// 如果想设置为某个日期,可以一次设置年月日时分秒,由于月份下标从0开始赋值月份要-1
// cal.set(year, month, date, hourOfDay, minute, second);
cal.set(2018, 1, 15, 23, 59, 59);
或者:
// 或者6个字段分别进行设置,由于月份下标从0开始赋值月份要-1
cal.set(Calendar.YEAR, 2018);
cal.set(Calendar.MONTH, Calendar.FEBRUARY);
cal.set(Calendar.DAY_OF_MONTH, 15);
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
System.out.println(cal.getTime());
3 时间计算
add方法:
比如在除夕当晚最后一秒,add 一秒:
Calendar cal = Calendar.getInstance();
System.out.println(cal.getTime());
cal.set(2018, 1, 15, 23, 59, 59);
cal.add(Calendar.SECOND, 1);
System.out.println(cal.getTime());
打印时间结果如下,日期会自动进入下一天:
Thu Feb 15 23:59:59 CST 2018
Fri Feb 16 00:00:00 CST 2018
再比如 1 月 31 号的时候,月份加一,会出现怎样结果:
Calendar cal = Calendar.getInstance();
cal.set(2018, 1, 31, 8, 0, 0);
System.out.println(cal.getTime());
cal.add(Calendar.MONTH, 1);
System.out.println(cal.getTime());
运行结果:
Wed Jan 31 08:00:00 CST 2018
Wed Feb 28 08:00:00 CST 2018
Andorid系统定时关机部分操作 : 当检测到当前设置的关机时间小于系统当前时间时,将本次设定的关机时间设定为明日同一时间:
String shutdown = null;//关机时间字符串
int[] AlarmOff = {2018,12,14,11,00}; //关机时间数据
int mYear = AlarmOff[0];
int mMonth = AlarmOff[1];
int mDay = AlarmOff[2];
int mHour = AlarmOff[3];
int mMinute = AlarmOff[4];
//将关机时间转换为字符串
StringBuilder date = new StringBuilder().append(mYear).append("/")
.append((mMonth < 10) ? "0" + mMonth : mMonth) .append("/")
.append((mDay < 10) ? "0" + mDay : mDay).append(" ")
.append((mHour < 10) ? "0" + mHour : mHour).append(":")
.append((mMinute < 10) ? "0" + mMinute : mMinute);
shutdown = date.toString();
//格式化关机时间 将关机时间字符串 转换为 yyyy/MM/dd HH:mm 格式的 英文日期时间格式
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
try {
date = sdf.parse(shutdown);
} catch (ParseException e) {
e.printStackTrace();
}
long timeSetup = date.getTime();//获取关机时间距离1970年1月1日(好像是这个时间)的毫秒数
long currTime = System.currentTimeMillis();
if(timeSetup < currTime){
date = getAfterDay(date); //将当前关机时间设置为第二天该时间关机
timeSetup = date.getTime();//获取当前时间毫秒数
Log.e(TAG,"shutdown day +1");
}
//将当前关机时间设置为第二天该时间关机
public Date getAfterDay(Date d){
Date date = null;
Calendar calendar = Calendar.getInstance();//获取一个日历对象
calendar.setTime(d); //将日历锁定到 d 时间
calendar.add(Calendar.DAY_OF_MONTH,1);//将锁定时间在当前日历上后移一天
date = calendar.getTime();//Calendar 类型转换为 Date 类型
return date;
}