使用Java8,新的日期时间API引入覆盖旧的日期时间API的以下缺点。
非线程安全 - java.util.Date不是线程安全的,因此开发者必须在使用日期处理并发性问题。新的日期时间API是不可变的,并且没有setter方法。
设计不佳 - 默认的开始日期从1900年,开始每月从1天从0开始,所以没有统一。不直接使用方法操作日期。新的API提供了这样操作实用方法。
困难的时区处理 - 开发人员必须编写大量的代码来处理时区的问题。新的API设计开发保持特定领域设计。
JAVA8引入了 java.time 包 - 下一个新的日期时间API。以下是一些在java.time程序包引入重要的类。
本地 - 简化日期时间API,没有时间处理区的复杂性。
时区 - 专业的日期时间API来处理各种时区。
java.time 本地日期时间类
java.time处理本地日期时间的主要类为 LocalDateTime,LocalDate,LocalTime;
- LocalDateTime可以处理日期时间,可以看做作为LocalDate,LocalTime的复合;
- LocalDate主要处理日期(year,month,day,week);
- LocalTime主要处理时间(h,m,s)
LocalDateTime注:localDateTime的 with,get,plus 方法,都有单项filed的实现 with[Filed](int filed),如 withDayOfMonth(int days),主要Field值如下:
- with,get: year,month,dayOfMonth,hour,minute,second,dayOfYear;
- plus : years,months,weeks,days,hours,minutes,seconds,nanos;
LocalDate注:同LocalDateTime ,LocalDate的 with,get,plus 方法,也都有单项filed的实现 with[Filed](int filed),主要Field值如下:
- with,get: year,month,dayOfMonth,dayOfYear;
- plus : years,months,weeks,days;
LocalTime注:同LocalDateTime ,LocalTime的 with,get,plus 方法,也都有单项filed的实现 with[Filed](int filed),主要Field值如下:
- with,get: hour,minute,second;
- plus : hours,minutes,seconds,nanos;
-
LocalDateTime,LocalDate,LocalTime都实现了compareTo,equals方法;
-
with,get方法中,实现 TemporalField 接口的类:java.time.temporal.ChronoField;
-
plus方法中,实现 TemporalAmout 接口的类:java.time.Duration,java.time.Peroid
ChronoField、ChronoUnit常量摘要
使用示例
输出结果:
import java.time.*;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
.....
//构建LocalDateTime
LocalDateTime dateTime1 = LocalDateTime.now();
LocalDateTime dateTime2 = LocalDateTime.of(2017,1,1,0,0,0);
System.out.println("datetime1:"+dateTime1+"\ndatetime2:"+dateTime2);
//修改LocalDateTime数值
LocalDateTime dateTime3 = dateTime1.with(ChronoField.YEAR,1992).with(ChronoField.MONTH_OF_YEAR,9).with(ChronoField.DAY_OF_MONTH,16);
System.out.println("datetime3:"+dateTime3);
//获取LocalDateTime数值
int year_dateTime3 = dateTime3.get(ChronoField.YEAR);
Month month_dateTime3 = dateTime3.getMonth();
int day_dateTime3 = dateTime3.get(ChronoField.DAY_OF_MONTH);
System.out.println("year:"+year_dateTime3+"\nmonth:"+month_dateTime3+"\nday:"+day_dateTime3);
//对LocalDateTime进行数值增减
LocalDateTime dateTime4 = dateTime3.plus(10,ChronoUnit.MONTHS).plusDays(100).plusHours(120);
System.out.println("datetime4:"+dateTime4);
System.out.println("datetime4:"+dateTime4.toEpochSecond(ZoneOffset.UTC));
//将LocalDateTime装载到LocalDate和LocalTime
LocalDate date1 = dateTime4.toLocalDate();
LocalTime time1 = dateTime4.toLocalTime();
System.out.println("date1:"+date1);
System.out.println("time1:"+time1);
datetime1:2017-02-28T19:42:09.550
datetime2:2017-01-01T00:00
datetime3:1992-09-16T19:42:09.550
year:1992
month:SEPTEMBER
day:16
datetime4:1993-10-29T19:42:09.550
datetime4:751923729
date1:1993-10-29
time1:19:42:09.550