Java8 新日期时间类(1)

时间:2021-01-13 22:06:02
Java.time 包的优势



使用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
静态构造方式摘要
static LocalDateTime 
static LocalDateTime  


static LocalDateTime
static LocalDateTime
now()
of(int year,int month,int dayofMonth,int hour,int minute[,int second[,int nanoSeconds]] )
parse(CharSequence text)
ofEpochSecond(long epochSeconds,int nanoSeconds,ZoneOffset offset)
使用当前时间构造一个LocalDateTime对象
使用指定的数值创建一个LocalDateTime对象 (year,month,day从1开始,hour,min,second从0开始)

使用形如 “2017-2-28T13:29:30”的格式创建对象
使用纪元流逝秒创建对象,起点为 1970-1-1T00:00:00,offset一般使用ZoneOffset.UTF
成员方法摘要
+LocalDate
+LocalTime
+ZoneDateTime

+LocalDateTime
+int
+LocalDateTime


+String
toLocalDate()
toLocalTime()
atZone()

with(TemporalField field,long value)
get(TemporalField field)
plus(TemporalAmount amoutToAdd)
plus(long amountToAdd,TemporaUnit unit)

toString()
获取该对象的 LocalDate对象
获取该对象的 LocalTime对象
获取该对象的 ZoneDateTime对象

修改LocalDateTime的时间数值参数(可以链式调用)
获取LocalDateTime的时间数值参数
对LocalDateTime的某个时间参数值的流逝量


字符串格式:2017-2-28T13:29:30
注: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
静态构造方式摘要
static LocalDate 
static LocalDate  

static LocalDate
static LocalDate
static LocalDate
now()
of(int year,int month[,int dayofMonth] )

parse
(CharSequence text)
ofEpochDay(long epochDay)
ofYearDay(int year,int dayOfyear)
使用当前时间构造一个LocalDate对象
使用指定的数值创建一个LocalDate对象 

使用形如 “2017-2-28”的格式创建对象
使用纪元流逝天数创建对象
指定年份,使用一年的总天数创建对象
成员方法摘要
+LocalDateTime
+LocalDateTime
+ZoneDateTime

+LocalDateTime
+int
+LocalDateTime


+String
asStartOfDay()
atTime
(int hour,int minute[,int second])
atZone()

with(TemporalField field,long value)
get(TemporalField field)
plus(TemporalAmount amoutToAdd)
plus(long amountToAdd,TemporaUnit unit)

toString()
获取该对象的 LocalDateTime对象(time值归零)
使用指定time值,创建LocalDateTime对象

获取该对象的 ZoneDateTime对象

修改LocalDate的时间数值参数(可以链式调用)
获取LocalDate的时间数值参数
对LocalDate的某个时间参数值的流逝量


字符串格式:2017-2-28
注:同LocalDateTime ,LocalDate的 with,get,plus 方法,也都有单项filed的实现  with[Filed](int filed),主要Field值如下:
  • with,get:   year,month,dayOfMonth,dayOfYear;
  • plus :    years,months,weeks,days;

LocalTime
静态构造方式摘要
static LocalTime 
static LocalTime  

static LocalTime
static LocalTime
static LocalTime
now()
of(int hour,int minute[,int dayofMonth] )

parse
(CharSequence text)
ofSecondOfDay(long seconds)
ofNanoOfDay(long nanoSeconds)
使用当前时间构造一个LocalDate对象
使用指定的数值创建一个LocalDate对象 

使用形如 “2017-2-28”的格式创建对象
使用指定seconds创建对象
使用指定nanoSeconds创建对象
成员方法摘要
+LocalDateTime

+LocalTime
+int
+LocalTime


+int
+int
+String
atDate(LocalDate date)

with
(TemporalField field,long value)
get(TemporalField field)
plus(TemporalAmount amoutToAdd)
plus(long amountToAdd,TemporaUnit unit)

toSecondOfDay()
toNanoOfDay()
toString
()
于一个LocalDate对象创建一个LocalDateTime对象

修改LocalTime的时间数值参数(可以链式调用)
获取LocalTime的时间数值参数
对LocalTime的某个时间参数值的流逝量


获取总Second参数
获取总Nano参数
字符串格式:10:15:00
注:同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
                             实现  TemporalUnit  接口的类:java.time.temporal. ChronoUnit

ChronoField、 ChronoUnit常量摘要
ChronoField ChronoUnit
YEAR                   
MONTH_OF_YEAR       
DAY_OF_MONTH
DAY_OF_WEEK
DAY_OF_YEAR        

HOUR_OF_DAY     24小时制hour
HOUR_OF_AMPM    12小时制hour
AMPM_OF_DAY     0(AM),1(PM)

MINUTE_OF_HOUR
MINUTE_OF_DAY
SECOND_OF_MINUTE
SECOND_OF_OF_DAY

OFFSET_SECOND     UTF流逝秒数
MILLI_OF_SECOND
MILLI_OF_DAY
NANO_OF_SECOND
NANO_OF_DAY
FOREVER    
CENTURIES

YEARS
MONTHS
WEEKS
DAYS

HOURS
MINUTES
SECONDS

NANOS


使用示例
 
   
  1. import java.time.*;
  2. import java.time.temporal.ChronoField;
  3. import java.time.temporal.ChronoUnit;
  4. .....
  5. //构建LocalDateTime
  6. LocalDateTime dateTime1 = LocalDateTime.now();
  7. LocalDateTime dateTime2 = LocalDateTime.of(2017,1,1,0,0,0);
  8. System.out.println("datetime1:"+dateTime1+"\ndatetime2:"+dateTime2);
  9. //修改LocalDateTime数值
  10. LocalDateTime dateTime3 = dateTime1.with(ChronoField.YEAR,1992).with(ChronoField.MONTH_OF_YEAR,9).with(ChronoField.DAY_OF_MONTH,16);
  11. System.out.println("datetime3:"+dateTime3);
  12. //获取LocalDateTime数值
  13. int year_dateTime3 = dateTime3.get(ChronoField.YEAR);
  14. Month month_dateTime3 = dateTime3.getMonth();
  15. int day_dateTime3 = dateTime3.get(ChronoField.DAY_OF_MONTH);
  16. System.out.println("year:"+year_dateTime3+"\nmonth:"+month_dateTime3+"\nday:"+day_dateTime3);
  17. //对LocalDateTime进行数值增减
  18. LocalDateTime dateTime4 = dateTime3.plus(10,ChronoUnit.MONTHS).plusDays(100).plusHours(120);
  19. System.out.println("datetime4:"+dateTime4);
  20. System.out.println("datetime4:"+dateTime4.toEpochSecond(ZoneOffset.UTC));
  21. //将LocalDateTime装载到LocalDate和LocalTime
  22. LocalDate date1 = dateTime4.toLocalDate();
  23. LocalTime time1 = dateTime4.toLocalTime();
  24. System.out.println("date1:"+date1);
  25. System.out.println("time1:"+time1);
输出结果:
 
    
  1. datetime1:2017-02-28T19:42:09.550
  2. datetime2:2017-01-01T00:00
  3. datetime3:1992-09-16T19:42:09.550
  4. year:1992
  5. month:SEPTEMBER
  6. day:16
  7. datetime4:1993-10-29T19:42:09.550
  8. datetime4:751923729
  9. date1:1993-10-29
  10. time1:19:42:09.550