一、JDK8之前
Date类使用(JDK1.0)
Date date1 = new SimpleDateFormat("yyyy-MM-dd").parse("2020-01-03");
Date date = new Date(); //分配一个 Date对象,并初始化它
System.out.println(date);
System.out.println(date.getTime()); //返回自1970年1月1日以来,由此 Date对象表示的00:00:00 GMT的毫秒数
System.out.println(date.before(date1));//date是不是在date1之前
System.out.println(date.compareTo(date1));//date和date1比较 date大于date1返回1,date小于date1返回-1,相等返回0
System.out.println(date.after(date1));//date是不是在date1之后
//下面是已经弃用的
System.out.println(date.getYear());//年
System.out.println(date.getMonth());//月,从0开始
System.out.println(date.getDay());//一周中第几日,从星期天为0
System.out.println(date.getDate());//一个月中第几日,从1开始
System.out.println(date.getHours());//小时,从1开始
System.out.println(date.getMinutes());//分钟
System.out.println(date.getSeconds());//秒
System.out.println(date.toLocaleString());//将时间转为本地格式的字符串
Calendar类使用(JDK1.1)
获取值
Calendar instance = Calendar.getInstance();
long time1 = Calendar.getInstance().getTimeInMillis();//以毫秒为单位返回此日历的时间值。
System.out.println(time1);
System.out.println(instance.get(Calendar.YEAR));//获取年
System.out.println(instance.get(Calendar.MONTH));//获取月 0 - 11
System.out.println(instance.get(Calendar.DATE));//天 一个月中的第几天
System.out.println(instance.get(Calendar.HOUR_OF_DAY));//小时
System.out.println(instance.get(Calendar.MINUTE));//分钟
System.out.println(instance.get(Calendar.SECOND));//秒
System.out.println(instance.get(Calendar.DAY_OF_WEEK));//周日是1/周一是2
设置值
Calendar instance = Calendar.getInstance();
System.out.println(instance.getTime());
instance.set(2013, 5, 4, 13, 44, 51);//设置年月日时分秒(月份0代表1月)
System.out.println(instance.getTime());
instance.set(Calendar.YEAR, 2014);//设置年
instance.set(Calendar.MONTH, 7);//设置月(月份0代表1月)
instance.set(Calendar.DATE, 11);//设置日
instance.set(Calendar.HOUR_OF_DAY, 15);//设置时
instance.set(Calendar.MINUTE, 33);//设置分
instance.set(Calendar.SECOND, 32);//设置秒
System.out.println(instance.getTime());
instance.setTimeInMillis(0);//转换成格林威治时间
System.out.println(instance.getTime());//也就是1970-01-01 08:00:00.
运算值
Calendar instance = Calendar.getInstance();
instance.add(Calendar.YEAR, 1);//增加年
instance.add(Calendar.MONTH, 1);//增加月
instance.add(Calendar.DATE, 1);//增加日
instance.add(Calendar.HOUR_OF_DAY, -1);//减少小时
instance.add(Calendar.MINUTE, 1);//增加分
instance.add(Calendar.SECOND, 1);//增加秒
instance.add(Calendar.WEEK_OF_MONTH, 1);//增加周
instance.add(Calendar.WEEK_OF_YEAR, 1);//增加周
System.out.println(instance.getTime().toLocaleString());
Calendar其他操作
Calendar instance = Calendar.getInstance();
Date time = instance.getTime();//返回值是Date Calendar -> Date
System.out.println(time);
Date time2 = new SimpleDateFormat("yyyy-MM-dd").parse("2020-01-03");
instance.setTime(time2);//设置时间
Calendar instance2 = Calendar.getInstance();
System.out.println(instance.compareTo(instance2));//比较时间 instance大于instance2返回1,instance小于instance2返回-1,相等返回0
//Calendar的子类GregorianCalendar
GregorianCalendar cal =
(GregorianCalendar) GregorianCalendar.getInstance();
System.out.println(cal.get(GregorianCalendar.YEAR));
System.out.println(cal.isLeapYear(2020));
二、JDK1.8
JDK8主要提供了LocalDate、LocalTime、LocalDateTime 几个类 分别对应日期、时间、日期时间 使用方式一致
获取时间
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);//当前的时间
System.out.println(ldt.getYear());
System.out.println(ldt.getMonth());//获取月对象
System.out.println(ldt.getMonthValue());
System.out.println(ldt.getDayOfMonth());//一个月的第多少天
System.out.println(ldt.getDayOfWeek());//一周的星期几
System.out.println(ldt.getDayOfYear());//一年的第几天
System.out.println(ldt.getHour());//小时
System.out.println(ldt.getMinute());//分钟
System.out.println(ldt.getSecond());//秒
设置时间
LocalDateTime ofldt = LocalDateTime.of(2020, 02, 02, 14, 22, 33);//设置时间
System.out.println(ofldt);
LocalDateTime ldt = LocalDateTime.now();
LocalDateTime ldt2 = ldt.withDayOfMonth(11);//设置日 当月
System.out.println(ldt);
System.out.println(ldt2);
LocalDateTime ldt3 = ldt.withDayOfYear(100);//设置日 当年
System.out.println(ldt3);
LocalDateTime ldt4 = ldt.withMonth(12);//设置月
System.out.println(ldt4);
LocalDateTime ldt5 = ldt.withYear(2000);//设置年
System.out.println(ldt5);
LocalDateTime ldt6 = ldt.withMinute(50);
System.out.println(ldt6);//设置分
LocalDateTime ldt7 = ldt.withSecond(30);
System.out.println(ldt7);//设置秒
操作时间
每次操作都会返回新的对象
LocalDateTime ldt = LocalDateTime.now();
LocalDateTime ldt2 = ldt.plusYears(2);//增加两年返回一个新的对象,不改变原对象
System.out.println(ldt);
System.out.println(ldt2);
LocalDateTime ldt3 = ldt.plusMonths(2);//增加两个月
System.out.println(ldt3);
LocalDateTime ldt4 = ldt.plusDays(2);//增加两天
System.out.println(ldt4);
LocalDateTime ldt5 = ldt.plusHours(2);//增加两个小时
System.out.println(ldt5);
LocalDateTime ldt6 = ldt.plusMinutes(12);//增加12分钟
System.out.println(ldt6);
LocalDateTime ldt7 = ldt.plusSeconds(22);//增加22秒
System.out.println(ldt7);
LocalDateTime ldt11 = ldt.minusMonths(2);//减两个月
System.out.println(ldt11);
其他操作
LocalDateTime ldt = LocalDateTime.now();
LocalDateTime ldt2 = ldt.plusHours(2);
int i2 = ldt2.compareTo(ldt);//ldt2大于ldt返回1,ldt2小于ldt2返回-1,相等返回0
System.out.println(ldt.isBefore(ldt2));//ldt在ldt2之前返回true,否则返回false
System.out.println(ldt.isAfter(ldt2));//ldt在ldt2之后返回true,否则返回false
//解析和格式化日期 DateTimeFormatter 是线程安全的
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");
LocalDateTime ldt = LocalDateTime.now();
String format = ldt.format(dtf);//格式化日期
System.out.println(format);
LocalDateTime parse = ldt.parse(format, dtf);//时间反解析
System.out.println(parse);
计算两个日期或时间的间隔
- Duration:计算两个时间间隔
- Period:计算两个日期间隔
Instant now = Instant.now();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Instant now2 = Instant.now();
Duration between = Duration.between(now, now2);
System.out.println("所耗费时间:" + between);
System.out.println(between.getSeconds());
System.out.println("----------------------------");
LocalDate ld1 = LocalDate.now();
LocalDate ld2 = LocalDate.of(2011, 1, 16);
Period pe = Period.between(ld1, ld2);
System.out.println(pe.getYears());//差了多少年/ld1比ld2少多少年
System.out.println(pe.getMonths());//多少月
System.out.println(pe.getDays());//查了多少日
System.out.println(pe);//差了多少年多少月多少日
时间校正器TemporalAdjuster
LocalDateTime ldt1 = LocalDateTime.now();
System.out.println(ldt1);
LocalDateTime ldt2 = ldt1.withDayOfMonth(10);
System.out.println(ldt2);
LocalDateTime ldt3 = ldt1.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));//下一个周日 日期
System.out.println(ldt3);
//自定义下一个工作日
LocalDateTime ldt5 = ldt1.with((l) -> {
LocalDateTime ldt4 = (LocalDateTime) l;
DayOfWeek dow = ldt4.getDayOfWeek();
if(dow.equals(DayOfWeek.FRIDAY)){
return ldt4.plusDays(3);
}else if(dow.equals(DayOfWeek.SATURDAY)){
return ldt4.plusDays(2);
}else{
return ldt4.plusDays(1);
}
});
System.out.println(ldt5);
时区的处理
Set<String> zoneIds = ZoneId.getAvailableZoneIds();//获取所有的时区
zoneIds.forEach(System.out::println);//打印所有的时区
LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));//上海时区
System.out.println(now);
ZonedDateTime now1 = ZonedDateTime.now(ZoneId.of("US/Pacific"));
System.out.println(now1);
Instant ins = Instant.now();//默认获取的是UTC时区为基准
System.out.println(ins);
System.out.println(ins.toEpochMilli());//获取时间戳 秒
OffsetDateTime atOffset = ins.atOffset(ZoneOffset.ofHours(8));//设置时区
System.out.println(atOffset);
System.out.println(ins.getNano());//纳秒
Instant instant = Instant.ofEpochSecond(5);//高边5秒钟
System.out.println(instant);