Java8新的日期时间API

常用类:

LocalDate、LocalTime、LocalDateTime、ZoneOffset、DateTimeFormatter、DateTimeFormatterBuilder

ChronoUnit、ChronoField、IsoFields、Temporal、TemporalAccessor、TemporalField、TemporalAdjuster、TemporalAmount、TemporalAdjusters

-------------------------------------------名词解释-------------------------------------------------

ISO-8601日历系统 - IsoFields(final class)

国际标准化组织的国际标准ISO 8601是日期和时间的表示方法,全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》。目前最新为第三版ISO8601:2004,第一版为ISO8601:1988,第二版为ISO8601:2000。

Julian Days(儒略日)- JulianFields(final class)

Epoch Day: 自1970-01-01(ISO)算起,当天为第0天,之后每天加1。

temporal object: 瞬时对象(表示某一时刻,可以是某一天,某一年,某)

-------------------------------------------类和接口-------------------------------------------------

Temporal 封装操作瞬时对象的方法

TemporalAdjuster:用来自定义瞬时对象调整规则的接口方法

TemporalAdjusters(final):以静态方法的形式提供了一系列常用的瞬时对象调整方法实现(返回TemporalAdjuster的匿名实现)

TemporalUnit: 定义了一些操作时间单位的方法,比如获取时间单位的长度,按指定单位计算两个时间点之间的长度等, ChronoUnit(enum)是它的实现类,并定义了常用时间单位的长度,年、月、日、时、分、秒、周等(除了纳秒、微秒和毫秒以纳秒为单位来表示长度外,其他单位都以秒来表示长度,比如1分钟=60秒,一天=86400秒)

TemporalField定义了对时间字段,比如某一月、某一年、某分钟的操作方法;ChronoField(enum)是它的实现类,并定义了常用时间单位的数值范围,比如按小时(MINUTE_OF_HOUR)算,那么分钟是0~59,如果按日(MINUTE_OF_DAY)算,那么则是0~(60*24)-1)

Instant(final)TemporalTemporalAdjuster接口的实现类,用来表示时间线上的某一点,可以看成时间戳,也是线程安全的。可通过Instant来进行新旧日期的转换,例如:

Date d0 = new Date();

Instant i0 = d0.toInstant();

LocalDateTime ldt0 = LocalDateTime.ofInstant(i0, ZoneId.systemDefault())

LocalDate ld0 = ldt0.toLocalDate();

LocalTime lt0 =  ldt0.toLocalTime();

d0 = Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant()); //LocalDateTime->Instant->Date

LocalDate、LocalTime、LocalDateTime:均是Temporal和TemporalAdjuster接口的实现类且是定义为final,不可继承且是线程安全的;每次对这些对象的修改都会创建一个新的瞬时对象。

TemporalAmount:  用来表示在某个时间单位上的时间数量,例如几天,几分钟,几小时等

Duration(final): TemporalAmount 接口的实现类,用来表示某一时段的长度

Period(final)-> ChronoPeriod -> TemporalAmount: 与Duration的区别是Duration同一时刻只能一种时间单位来表示时段长度,Period可以用多个单位来表示,比如

Period p = Period.between(LocalDate.now().plusDays(1), LocalDate.now().with(TemporalAdjusters.lastDayOfYear()).plusDays(1));

System.out.println("距离今年结束还剩下:: " + String.format("%d years, %d months, %d days", p.getYears(), p.getMonths(), p.getDays()));

ZoneOffset(final): 时区偏移值,通过偏移值将当前时区时间换算到指定时区的时间

周数计算:

System.out.println("按照自然星期算, 周一~周日为一周,2020年1月1日是20年第几周 : " + LocalDate.of(2020, 1, 1).get(IsoFields.WEEK_OF_WEEK_BASED_YEAR));

System.out.println("按照自然星期算, 周一~周日为一周,2020年1月6日是20年第几周 : " + LocalDate.of(2020, 1, 6).get(IsoFields.WEEK_OF_WEEK_BASED_YEAR));

System.out.println("从当年第一天算起,每7天为一周,2020年1月7日是20年第几周 : " + LocalDate.of(2020, 1, 7).get(ChronoField.ALIGNED_WEEK_OF_YEAR));

----------------------------------------------------新旧时间类对比----------------------------------------------

1) Date类年份是以1900年为起点的,设置的时候,负值表示1900年-去该值的年份,正值表示1900+该值的年份; 新的日期支持9位数的正负年值

Date d = new Date(-1,8,25);  //表示1899年8月25日

d.setYear(10);  //则该日期变成了1910年8月25日

2)Date使用长整型数值表示时,则是以1970年0时区为中心点, 对应0,负数表示1970年前的日期,正数表示1970年后的日期

d.setTime(0); //则修改上面的日期变成1970-01-01 00:00:00,需要注意的是,此时是Greenwich时区的0时,如果将日期格式化时,会按照实际时区计算,比如在+8时区,则格式化后是1970-01-01 08:00:00,即Date实例所代表的时间是携带时区信息的,在不同时区会进行自动换算,新的时间对象表示的时间则不带时区信息。

new Date(-28800000); //这个日期在+8时区表示1970-01-01 00:00:00,在Greenwich时区则表示1969-12-31 16:00:00;

3)Calendar类支持直接设置1900年前的日期,但使用数值设置日期时跟Date一样是从1970-01-01 00:00:00开始的,

Calendar.getInstance().setTimeInMillis(1000); //表示1970-01-01 00:00:01 

4)Date和Calendar的实例所表示的时间值均是可以修改的,新的时间对象表示的时间值不可修改,每次修改都是生成新的时间对象。

5)我们使用SimpleDateFormat对Date实例进行格式化,SimpleDateFormat扩展DateFormat抽象类,使用一个全局变量Calendar实例来保存时间,在多个线程中使用同个SimpleDateFormat来格式化或者解析日期时会出现异常,是非线程安全的。

你可能感兴趣的:(Java8新的日期时间API)