为什么要学JDK8新增时间相关类
JDK8时间
Zoneld时区
public static void main(String[] args) {
//获取所有地区的时区
Set<String> zoneIds = ZoneId.getAvailableZoneIds();
System.out.println(zoneIds);
System.out.println(zoneIds.size());//1600 个时区
//获取当前系统默认时区
ZoneId zoneId1 = ZoneId.systemDefault();
System.out.println(zoneId1);//Asia/Shanghai
//获取指定的时区
ZoneId zoneId2 = ZoneId.of("America/Cuiaba");
System.out.println(zoneId2);//America/Cuiaba
}
}
Insant
public static void main(String[] args) {
//获取当前时间的instant对象 标准时间
Instant instant = Instant.now();
System.out.println(instant);//2023-10-19T02:42:09.362530600Z
//2根据(秒 毫秒 纳秒)值获取instant对象
Instant instant1 = Instant.ofEpochMilli(1000);
System.out.println(instant1);//1970-01-01T00:00:01Z 因为时1000秒所以时1秒
Instant instant2 = Instant.ofEpochSecond(1);
System.out.println(instant2);//1970-01-01T00:00:01Z 传入1秒
//第一个代表传入的秒数 第二个是纳秒 相加所以是2
Instant instant3 = Instant.ofEpochSecond(1, 1000000000);
System.out.println(instant3);//1970-01-01T00:00:02Z
//3指定时区
//用static修饰的方法或者变量只能用类名去调用 而没用这个修饰的方法可以创建对象来调用`
ZonedDateTime zonedDateTime = instant.now().atZone(ZoneId.of("Asia/Shanghai"));
System.out.println(zonedDateTime);//2023-10-19T10:49:23.408127100+08:00[Asia/Shanghai]
//instant.now()获取当前时间的Instant对象 atZone(ZoneId.of("Asia/Shanghai"))指定时区
//4isxxx判断
Instant instant4 = Instant.ofEpochMilli(1);
Instant instant5 = Instant.ofEpochMilli(1000);
//判断下哪个在前哪个在后
boolean before = instant4.isBefore(instant5);
System.out.println(before);//判断4是不是在5之前
//true
boolean after = instant5.isAfter(instant4);
System.out.println(after);//true
//5min往前减少的方法
Instant instant6 = Instant.ofEpochMilli(5000);
System.out.println(instant6);//1970-01-01T00:00:05Z
Instant instant7 = instant6.minusSeconds(2);
System.out.println(instant7);//上面减去2秒 所以结果为1970-01-01T00:00:03Z
用static修饰的方法或者变量只能用类名去调用 而没用这个修饰的方法可以创建对象来调用
ZoneDateTime
原理同上相同 但是ZoneDateTime获取的时间是带时区的
日期指定格式类DateTimeFormatter
public static void main(String[] args) {
//获取事件对象
ZonedDateTime zonedDateTime = Instant.now().atZone(ZoneId.of("Asia/Shanghai"));
//解析格式化 变成想要的格式
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EE a");//ee代表星期 a代表上午下午
//格式化
System.out.println(dateTimeFormatter.format(zonedDateTime));
//按照自己设置的格式打印
//2023-10-19 11:24:39 周四 上午
Calender
LocalTime,LocalDate,LocalDateTime
LocalTime只能获取时分秒
LocalDate只能获取年月日
LocalDateTime获取年月日和时分秒
LocalDateTime可以转化为另外两个如下图
以下为LocalDate
这个更适用于精确时间的 比如秒杀软件
以下为LocalDateTime
工具类
Duration 时间间隔(秒纳秒)
Perido(年月日)
public static void main(String[] args) {
//获取当前的年月日
LocalDate today = LocalDate.now();
System.out.println(today);
LocalDate dateTime = LocalDate.of(2000, 1, 1);
//这个是指定的时间
//然后把两个相减 年月日
//用Perido
Period period = Period.between(dateTime, today);
//第二个参数减去第一个参数
System.out.println("时间间隔为:"+period);
System.out.println(period.getYears());//间隔年
System.out.println(period.getMonths());
System.out.println(period.getDays());
//获取间隔总月数
System.out.println(period.toTotalMonths());
//285个月