java8中的日期和时间API

java8中引入新的日期时间API,主要解决原来日期操作复杂,表示不清晰,线程不安全等问题。

日期创建

1. LocalDate和LocalTime

//指定日期创建
LocalDate date = LocalDate.of(2019, 10, 20);
System.out.println(date.getYear()); //2019
System.out.println(date.getMonth().getValue()); //10
System.out.println(date.getDayOfMonth());//20
System.out.println(date.isLeapYear());//是否是闰年:false
//获取当前日期
LocalDate date = LocalDate.now();
//使用TemporalField读取LocalDate的值 
System.out.println(date.get(ChronoField.YEAR));
System.out.println(date.get(ChronoField.MONTH_OF_YEAR));
System.out.println(date.get(ChronoField.DAY_OF_MONTH));
//指定时间创建
LocalTime time = LocalTime.of(18, 10, 58);
System.out.println(time.getHour());//18
System.out.println(time.getMinute());//10
System.out.println(time.getSecond());//58
//获取当前时间
LocalTime time = LocalTime.now();
//使用TemporalField读取LocalTime的值     
System.out.println(time.get(ChronoField.HOUR_OF_DAY));
System.out.println(time.get(ChronoField.MINUTE_OF_HOUR));
System.out.println(time.get(ChronoField.SECOND_OF_MINUTE));

LocalDate和LocalTime都可以通过解析代表它们的字符串创建。使用静态方法parse进行解析。

LocalDate date = LocalDate.parse("2019-10-20");
LocalTime time = LocalTime.parse("18:10:58");

2. LocalDateTime

LocalDateTime,是LocalDate和LocalTime的合体。它同时表示了日期 和时间,但不带有时区信息,可以直接创建,也可以通过合并日期和时间对象构造。

LocalDateTime dt1 = LocalDateTime.of(2019, 10, 20, 18, 10, 58);
LocalDateTime dt2 = LocalDateTime.of(date, time);
LocalDateTime dt3 = date.atTime(time);
LocalDateTime dt4 = time.atDate(date);

从LocalDateTime获取LocalDate或LocalTime

LocalTime time1 = dt1.toLocalTime();
LocalDate date1 = dt1.toLocalDate();

操纵、解析和格式化日期

1. 使用withAttribute修改日期

如果你已经有一个LocalDate对象,想要创建它的一个修改版,最直接也最简单的方法是使用withAttribute方法。withAttribute方法会创建对象的一个副本,并按照需要修改它的属性。注意,下面的这段代码中所有的方法都返回一个修改了属性的对象。它们都不会修改原来的对象!

LocalDate date1 = LocalDate.of(2019, 10, 20); 
LocalDate date2 = date1.withYear(2020); 
LocalDate date3 = date2.withDayOfMonth(25); 
LocalDate date4 = date3.with(ChronoField.MONTH_OF_YEAR, 9); 

System.out.println(date1.toString());//2019-10-20
System.out.println(date2);//2020-10-20
System.out.println(date3);//2020-10-25
System.out.println(date4);//2020-09-25
2. 使用plus/minus修改日期
LocalDate date1 = LocalDate.of(2019, 10, 20); 
LocalDate date2 = date1.plusYears(1);
LocalDate date3 = date2.minusMonths(1);
LocalDate date4 = date3.plusDays(5);

System.out.println(date1.toString());//2019-10-20
System.out.println(date2);//2020-10-20
System.out.println(date3);//2020-09-20
System.out.println(date4);//2020-09-25
表示时间点的日期-时间类的通用方法 :
方法名 是否是静态方法 描述
from 依据传入的 Temporal 对象创建对象实例
now 依据系统时钟创建 Temporal 对象
of 由Temporal对象的某个部分创建该对象的实例
parse 由字符串创建Temporal对象的实例
atOffset 将Temporal对象和某个时区偏移相结合
atZone 将Temporal 对象和某个时区相结合
format 使用某个指定的格式器将Temporal对象转换为字符串(Instant类不提供该方法)
get 读取 Temporal 对象的某一部分的值
minus 创建 Temporal 对象的一个副本,通过将当前 Temporal 对象的值减去一定的时长 创建该副本
plus 创建 Temporal 对象的一个副本,通过将当前 Temporal 对象的值加上一定的时长 创建该副本
with 以该Temporal对象为模板,对某些状态进行修改创建该对象的副本
3. 解析和格式化日期
//使用默认格式
LocalDate date = LocalDate.of(2019, 10, 20); 
String s1 = date.format(DateTimeFormatter.BASIC_ISO_DATE); //20191020
String s2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE); //2019-10-20
//使用自定义格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); 
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy:MM:dd"); 

String s1 = date.format(formatter); 
String s2 = date.format(formatter2); 

System.out.println(s1);//20/10/2019
System.out.println(s2);//2019:10:20

LocalDate date2 = LocalDate.parse(s2, DateTimeFormatter.ISO_LOCAL_DATE);
System.out.println(date2);//2019-10-20
LocalDateTime date = LocalDateTime.of(2019, 10, 20, 18, 10, 58);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒"); 
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy:MM:dd HH:mm:ss"); 
String s1 = date.format(formatter); 
String s2 = date.format(formatter2); 

System.out.println(s1);//2019年10月20日 18时10分58秒
System.out.println(s2);//2019:10:20 18:10:58

LocalDateTime date2 = LocalDateTime.parse(s2, formatter2);
System.out.println(date2);//2019-10-20T18:10:58

时区

新的java.time.ZoneId 类是老版java.util.TimeZone的替代品

获取当前时区

ZoneId zoneId = ZoneId.systemDefault(); 
System.out.println(zoneId);
ZoneId test = ZoneId.of("America/New_York");

LocalDateTime dateTime = LocalDateTime.now();
LocalDateTime ldt = LocalDateTime.now(test);
ZonedDateTime zdt = dateTime.atZone(test);
 
System.out.println(dateTime);//2019-10-20T19:31:52.186
System.out.println(ldt);//2019-10-20T07:31:52.186
LocaleDate、LocalTime、LocalDateTime以及ZoneId之间的关系:

java8中的日期和时间API_第1张图片

相关链接:
java8中map新增方法详解
java8中Stream的使用
java8中Collection新增方法详解
java8中Collectors的方法使用实例
java8中常用函数式接口
java8中的方法引用和构造函数引用
java8中的Collectors.groupingBy用法
java8中的Optional用法
java8中的日期和时间API

你可能感兴趣的:(java,java8日期和时间api,LocalDateTime,LocalDate,LocalTime,ZoneId)