JavaSE进阶7之JDK8新增日期类
JDK8新增日期类
- 新增的API严格区分了时刻,本地日期,本地时间,并且,对日期和时间进行运算更加方便
- 其次,新API的类型几乎全部是不变类型(和String的使用类似),可以放心使用不必担心被修改
LocalDate、LocalTime、LocalDateTime
- 他们分别表示日期,时间,日期时间对象,他们的类的实例是不可变的对象
- 他们三者构建对象和API都是通用的
public class demo8 {
public static void main(String[] args) {
LocalDate nowDate=LocalDate.now();
int year=nowDate.getYear();
int month=nowDate.getMonthValue();
int day=nowDate.getDayOfMonth();
System.out.println("今天的日期:"+nowDate);
System.out.println("year:"+year);
System.out.println("month:"+month);
System.out.println("day:"+day);
//当年的第几天
int dayOf = nowDate.getDayOfYear();
System.out.println("dayOfyear:"+dayOf);
//星期
DayOfWeek dayOfWeek = nowDate.getDayOfWeek();
System.out.println(dayOfWeek);
int week = nowDate.getDayOfWeek().getValue();
System.out.println(week);
LocalDate ld=LocalDate.of(2000,02,20);
System.out.println(ld);
}
}
转换相关的API
public class demo10 {
public static void main(String[] args) {
LocalDateTime nowTime=LocalDateTime.now();
System.out.println("现在的时间是:"+nowTime);
int year = nowTime.getYear();
System.out.println("year:"+year);
Month month = nowTime.getMonth();
System.out.println("Month:"+month);
int monthV=nowTime.getMonthValue();
System.out.println("MonthValue:"+monthV);
int day=nowTime.getDayOfMonth();
System.out.println("dayOfMonth:"+day);
int dayOfYear=nowTime.getDayOfYear();
System.out.println("dayOfyear:"+dayOfYear);
DayOfWeek dayOfWeek = nowTime.getDayOfWeek();
System.out.println("dayOfWeek:"+dayOfWeek);
int dayOfWeekV = nowTime.getDayOfWeek().getValue();
System.out.println("dayOfWeekValue:"+dayOfWeekV);
int hour=nowTime.getHour();
System.out.println("hour:"+hour);
int minute=nowTime.getMinute();
System.out.println("minute:"+minute);
int second=nowTime.getSecond();
System.out.println("second:"+second);
int nano = nowTime.getNano();
System.out.println("nano:"+nano);
LocalDateTime ds = LocalDateTime.of(2000, 2, 10, 15, 32, 43, 524);
System.out.println(ds.getYear());
System.out.println(ds.getHour());
System.out.println("-------------------------");
LocalDate ld=nowTime.toLocalDate();
System.out.println("year:"+ld.getYear());
System.out.println("month:"+ld.getMonth());
System.out.println("day:"+ld.getDayOfMonth());
System.out.println("-------------------------");
LocalTime lt=nowTime.toLocalTime();
System.out.println("hour:"+lt.getHour());
System.out.println("minute:"+lt.getMinute());
System.out.println("second:"+lt.getSecond());
}
}
修改相关API
- LocalDateTime综合了LocalDate和LocalTime里面的方法,所以下面只用LocalDate和LocalTime来举例
- 这些方法返回的是一个新的实例引用,因为LocalDateTime,LocalDate,LocalTime都是不可变化的
public class damo11 {
public static void main(String[] args) {
LocalTime nowTime= LocalTime.now();
System.out.println(nowTime);
System.out.println(nowTime.minusHours(1)); //1小时前
System.out.println(nowTime.minusMinutes(1)); //1分钟前
System.out.println(nowTime.minusSeconds(1)); //1秒钟前
System.out.println(nowTime.minusNanos(1)); //1纳秒前
System.out.println("------------------------------");
System.out.println(nowTime);
System.out.println(nowTime.plusHours(1)); //1小时后
System.out.println(nowTime.plusMinutes(1)); //1分钟后
System.out.println(nowTime.plusSeconds(1)); //1秒钟后
System.out.println(nowTime.plusNanos(1)); //1纳秒后
LocalDate setDate=LocalDate.of(2000,2,20);
LocalDate nowDate=LocalDate.now();
System.out.println("今天是2000年2月20日吗?"+nowDate.equals(setDate));
System.out.println("今天在2000年2月20日前吗?"+nowDate.isBefore(setDate));
System.out.println("今天在2000年2月20日后吗?"+nowDate.isAfter(setDate));
//判断今天是否是你的生日生日的
LocalDate birth=LocalDate.of(2000,2,20);
LocalDate nowDate1=LocalDate.now();
//获取月与日
MonthDay birthMonDay= MonthDay.of(birth.getMonthValue(),birth.getDayOfMonth());
MonthDay nowMonday=MonthDay.from(nowDate1);
System.out.println("今天是否是你的生日?"+nowMonday.equals(birthMonDay));
}
}
instant时间戳
- jdk8获取时间戳特别简单,且功能更丰富,Instant类由一个静态的工厂方法now()可以返回当前时间戳
- 时间戳是包含日期和时间的,与Java.util.Date很类似,事实上Instant就是类似JDK8以前的Date
- Instant和Date这两个类可以进行转换
package com.echo.d4_javase.use_Date;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;
public class demo12 {
public static void main(String[] args) {
Instant instant=Instant.now();
System.out.println(instant); //世界时间
Instant instant1=Instant.now();
ZonedDateTime zdt = instant1.atZone(ZoneId.systemDefault());
System.out.println(zdt);
//Instant 与Date 互相转换
Date date= Date.from(instant);
System.out.println(date);
Instant instant2 = date.toInstant();
System.out.println(instant2);
}
}
DateTimeFormatter
- 在JDK8中,引入了一个全新的日期与时间格式器的DateTimeFormatter
- 正反都能调用format方法
package com.echo.d4_javase.use_Date;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;
public class demo12 {
public static void main(String[] args) {
Instant instant=Instant.now();
System.out.println(instant); //世界时间
Instant instant1=Instant.now();
ZonedDateTime zdt = instant1.atZone(ZoneId.systemDefault());
System.out.println(zdt);
//Instant 与Date 互相转换
Date date= Date.from(instant);
System.out.println(date);
Instant instant2 = date.toInstant();
System.out.println(instant2);
}
}
Duration/Period类
Period类
- 在java8中,我们可以使用以下类来计算日期间隔差异:Java.time.Period
- 主要是Period类方法getYears(),getMonths(),getDays()来计算,只能精确到年月日
- 用于LocalDate之间的比较
Duration类
- 在Java8中,我们可以使用以下类来计算时间间隔差异:java.time.Duration
- 提供了使用基于时间的测量时间量的方法
- 用于LocalDateTime之间的比较,也可用于instant之间的比较
package com.echo.d4_javase.use_Date;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;
public class demo14 {
public static void main(String[] args) {
//Period类
LocalDate nowDate= LocalDate.now();
LocalDate birthDate=LocalDate.of(2000,2,20);
Period p= Period.between(birthDate,nowDate);
System.out.println("从生日那天到今天有"+p.getYears()+"年,"+p.getMonths()+"月,"+p.getDays()+"天");
//Duration类
LocalDateTime today=LocalDateTime.now();
LocalDateTime birth=LocalDateTime.of(2000,2,20,19,30,27,36500);
Duration over = Duration.between(birth, today);
System.out.println("从生日那天到今天有"+over.toDays()+"天,"+over.toHours()+"时,"+over.toMinutes()+"分,"+over.toSeconds()+"秒,"+over.toNanos()+"纳秒");
}
}
ChronoUnit类
java.time.temporal.ChronoUnit
- 用于在单个时间单位内测量一段时间,可以用于比较所有的时间单位
package com.echo.d4_javase.use_Date;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
public class demo15 {
public static void main(String[] args) {
LocalDateTime today=LocalDateTime.now();
LocalDateTime birth=LocalDateTime.of(2000,2,20,19,30,32,1233);
System.out.println("相差的年数:"+ChronoUnit.YEARS.between(birth,today));
System.out.println("相差的月数:"+ChronoUnit.MONTHS.between(birth,today));
System.out.println("相差的周数:"+ChronoUnit.WEEKS.between(birth,today));
System.out.println("相差的天数:"+ChronoUnit.DAYS.between(birth,today));
System.out.println("相差的时数:"+ChronoUnit.HOURS.between(birth,today));
System.out.println("相差的分数:"+ChronoUnit.MINUTES.between(birth,today));
System.out.println("相差的秒数:"+ChronoUnit.SECONDS.between(birth,today));
System.out.println("相差的毫秒数:"+ChronoUnit.MILLIS.between(birth,today));
System.out.println("相差的微妙数:"+ChronoUnit.MICROS.between(birth,today));
System.out.println("相差的纳秒数:"+ChronoUnit.NANOS.between(birth,today));
System.out.println("相差的半天数:"+ChronoUnit.HALF_DAYS.between(birth,today));
System.out.println("相差的十年数:"+ChronoUnit.DECADES.between(birth,today));
System.out.println("相差的世纪(百年)数:"+ChronoUnit.CENTURIES.between(birth,today));
System.out.println("相差的千年数:"+ChronoUnit.MILLENNIA.between(birth,today));
System.out.println("相差的纪元数:"+ChronoUnit.ERAS.between(birth,today));
}
}