Date和Calendar API
为了解决计时问题, 人类为时间人为的设计原点和刻度! 称为"历法"
计算机时间: 原点(元年)是1970年元旦, 刻度是毫秒数.
获取当前系统时间
//获取当前系统时间毫秒数
long now = System.currentTimeMillis();
System.out.println(now);
//1511331950177
long year=now/1000/60/60/24/365+1970;
System.out.println(year);
//获得当前的秒数
long sec=now/1000 % 60;
System.out.println(sec);
long min = now/1000/60 % 60;
System.out.println(min);
long hour = now/1000/60/60%24+8;
System.out.println(hour);
//long的最大值是哪一年?
long max = Long.MAX_VALUE;
System.out.println(max);
year = max/1000/60/60/24/365+1970;
System.out.println(year);
Date相关API
/**
* Date API
*Date内部封装了一个时间毫秒数(UTC/GMT)用于表示的时间, 提供时间分量的计算方法, 但是由于历史原因,不建议使用, 这些时间分量计算方法建议使用Calender替换.
*date.getTime() 获取时间毫秒数
* date.setTime(t) 设置(修改)时间毫秒数
*/
long now=System.currentTimeMillis();
Date date = new Date(now);
//new Date(); 默认构造器封装的就是当前时间
SimpleDateFormat 日期转换类 format方法和parse方法
public static void main(String[] args) throws Exception{
/*
* 日期格式化输出
* SimpleDateFormat 类
* 1. 提供了日期数据格式化为String
* 方法, 用于将日期显示为人类习惯
* 的格式
* format() 方法
* 2. 提供了将人类习惯的日期字符串,
* 转换为计算机能处理的 Date 时间
* 也就是毫秒数
* parse() 方法
*/
SimpleDateFormat fmt=
new SimpleDateFormat();
//将date的时间毫秒数, 转换为人类习惯
//年月日 时分 字符串
Date date = new Date();
String str=fmt.format(date);
System.out.println(str);
//可以利用自定义格式实现日期的格式化
long t = date.getTime();
t+=1000L*60*60*24*90;
date.setTime(t);
fmt=new SimpleDateFormat(
"yyyy-M-d HH:mm:ss");
str=fmt.format(date);
System.out.println(str);
//将人类习惯的时间字符串, 转换为date
String d = "1949-10-1";
//根据被解析的字符串格式设置 "格式规则"
SimpleDateFormat fmt2=
new SimpleDateFormat(
"yyyy-M-d");
Date da = fmt2.parse(d);
System.out.println(da);
//1970年元旦以前的时间毫秒数是负数
long l = da.getTime();
System.out.println(l);
//时间原点的理解
Date dx = new Date(10000);
System.out.println(
fmt.format(dx));
}
Calendar相关API
public static void main(String[] args) {
/*
* 由于Date的API方法有设计缺陷
* 建议使用Calendar替换Date的API方法
* 这些方法功能包括:
* 1. 计算时间分量: 根据毫秒数换算
* 时间分量: 年月日时分秒
* 2. 设置时间分量
* 修改 年月日时分秒, 底层是利用
* 毫秒数换算得到结果.
* 3. 增加/减少时间分量
* 增加/减少指定的毫秒数
*/
//获得Calendar对象: 其中包含当前毫秒数
//Calendar的默认实现类: 格里高里历
// 就是公元历法
Calendar cal=Calendar.getInstance();
//获取(计算)日期分量的方法
int sec = cal.get(Calendar.SECOND);//秒
int min = cal.get(Calendar.MINUTE);//分
int hour= cal.get(Calendar.HOUR);//时
//月(MONTH)中的天数
int d = cal.get(Calendar.DAY_OF_MONTH);
int m = cal.get(Calendar.MONTH)+1;//月要+1
int y = cal.get(Calendar.YEAR);//年
System.out.println(
y+"-"+m+"-"+d);
System.out.println(
hour+":"+min+":"+sec);
//cal能够设置时间分量, 其底层就是
//利用时间毫秒计算实现的.
cal.set(Calendar.YEAR, 2018);
//cal可以转换为Date
Date date = cal.getTime();
System.out.println(date);
//设置时间的月份为1月 (JANUARY)
cal.set(Calendar.MONTH,
Calendar.JANUARY);
date = cal.getTime();
System.out.println(date);
//cal 可以增加时间分量, 也可以减少时间分量
cal.add(Calendar.YEAR, 1);
cal.add(Calendar.MONTH, -1);
date = cal.getTime();
System.out.println(date);
//检查一个月中最大的天数
//Actual 实际上 Maximum 最大的
int max=cal.getActualMaximum(
Calendar.DAY_OF_MONTH);
System.out.println(max);
}
简单案例实现
public static void main(String[] args)
throws Exception {
/*
* 计算劳动合同续签提醒日
* 1. 输入劳动合同签订日期
* 2. 输入有效年份
* 3. 计算到劳动合同到期时间
* 4. 计算提前一个月
* 5. 再提前一周
* 6. 如果遇到周末
* 如果是周日加一天
* 如果是周六加2天
* 7. 输出续签提醒日
*/
Scanner in=new Scanner(System.in);
System.out.print("签订日期:");
String d = in.nextLine();
System.out.print("年数:");
String y = in.nextLine();
//将字符串转换为日期
SimpleDateFormat fmt=
new SimpleDateFormat("yyyy-M-d");
Date signDate=fmt.parse(d);
//将年份转换为整数:
int years = Integer.parseInt(y);
//调用计算方法
Date dx = alert(signDate, years);
//显示计算结果:
String str=fmt.format(dx);
System.out.println(str);
}
/**
* 计算劳动合同提醒日期
* @param signDate 签订日期
* @param years 签订年份数
* @return 提醒日期
*/
public static Date alert(
Date signDate, int years){
//创建cal默认是当前时间
Calendar cal=Calendar.getInstance();
//将cal时间修改为签订时间
cal.setTime(signDate);
//计算到期时间
cal.add(Calendar.YEAR, years);
//提前一个月
cal.add(Calendar.MONTH, -1);
//提前一周
cal.add(Calendar.WEEK_OF_MONTH, -1);
//判断是周末吗?
int day=cal.get(Calendar.DAY_OF_WEEK);
if(day==Calendar.SUNDAY){//周日
cal.add(Calendar.DAY_OF_MONTH, 1);
}else if(day==Calendar.SATURDAY){//六
cal.add(Calendar.DAY_OF_MONTH, 2);
}
return cal.getTime();
}