目录:
第一篇:初探 java8 第 01 篇( Lambda与Stream API初识 )
第二篇:深入 java8 第 02 篇( Lambda表达式基础语法 )
第三篇:深入 java8 第 03 篇( 函数式接口,常见的4个函数式接口 )
第四篇:深入 java8 第 04 篇( 方法引用与构造器引用 )
第五篇:深入 java8 第 05 篇( Stream API 的操作->创建及中间操作 )
第六篇:深入 java8 第 06 篇( Stream API 的操作->终止操作 )
第七篇:深入 java8 第 07 篇( Stream API 的操作->规约、收集 )
第八篇:深入 java8 第 08 篇( Stream API 的综合练习 )
第九篇:深入 java8 第 09 篇( Fork/Join 框架的使用及其优势 )
第十篇:深入 java8 第 10 篇( 时间新特新 -> DateTimeFormatter 解析与格式化 )
第十一篇:深入 java8 第 11 篇( 带时区的时间或日期)
第十二篇:深入 java8 第 12 篇(接口中的默认方法与静态方法 )
第十三篇:深入 java8 第 13 篇( 其他新特性 -> Optional 类/重复注解与类型注解 )
深入 java8 第 10 篇( 带时区的时间或日期 )
Java8中的新时间日期API:
LocalDate、 LocalTime、 LocalDateTime 类的实例是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前的时间信息。也不包含与时区相关的信息。
注: ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法!
11.1 LocalDate、LocalTime、LocalDateTime
以三个实例是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。
@Test
public void test01(){
LocalDate date = LocalDate.now();
System.out.println(date);
LocalTime time = LocalTime.now();
System.out.println("\n"+time);
LocalDateTime dateTime = LocalDateTime.now();
System.out.println("\n"+dateTime);
}
11.2 测试实例的方法
now() 静态方法,根据当前时间创建对象
of() 静态方法,根据指定日期/时间创建对象
plusDays,plusWeeks,plusMonths,plusYears 向当前 LocalDate 对象添加几天、几周、几个月、几年
minusDays,minusWeeks,minusMonths,minusYears 从当前 LocalDate 对象减去几天、几周、几个月、几年
plus, minus 添加或减少一个 Duration 或 Period
withDayOfMonth,withDayOfYear,withMonth,withYear 将月份天数、年份天数、月份、年份修改为指定 的值 并返回新的LocalDate 对象
getDayOfMonth 获得月份天数(1-31)
getDayOfYear 获得年份天数(1-366)
getDayOfWeek 获得星期几(返回一个 DayOfWeek枚举值)
getMonth 获得月份, 返回一个 Month 枚举值
getMonthValue 获得月份(1-12)
getYear 获得年份
until 获得两个日期之间的 Period 对象,或者指定 ChronoUnits 的数字
isBefore, isAfter 比较两个 LocalDate
isLeapYear 判断是否是闰年
@Test
public void test02() throws InstantiationException, IllegalAccessException{
// now
LocalDate date = LocalDate.now();
System.out.println(date);
// of
LocalDate date2 = LocalDate.of(2018, 04, 29);
System.out.println("\n"+date2);
// plusDays,plusWeeks,plusMonths,plusYears
LocalDateTime time = LocalDateTime.now();
LocalDateTime time2 = time.plusDays(3);
LocalDateTime time3 = time2.plusWeeks(3);
LocalDateTime time4 = time3.plusMonths(3);
LocalDateTime time5 = time4.plusYears(3);
System.out.println("\n"+time);
System.out.println(time2);
System.out.println(time3);
System.out.println(time4);
System.out.println(time5);
// plus, minus
LocalDate date3 = LocalDate.now();
LocalDate plus = date3.plus(Period.of(01, 04, 0));
LocalDate minus = date3.minus(Duration.ZERO);
System.out.println("\n"+plus);
System.out.println(minus);
// withDayOfMonth,withDayOfYear,withMonth,withYear
LocalDate date4 = LocalDate.now();
LocalDate dayOfMonth = date4.withDayOfMonth(11);
LocalDate dayOfYear = date4.withDayOfYear(20);
LocalDate month = date4.withMonth(3);
LocalDate year = date4.withYear(2019);
System.out.println("\n"+dayOfMonth);
System.out.println(dayOfYear);
System.out.println(month);
System.out.println(year);
// getDayOfMonth,getDayOfYear,getDayOfWeek,getMonth,getMonthValue,getYear
LocalDate date5 = LocalDate.now();
int dayOfMonth2 = date5.getDayOfMonth();
int dayOfYear2 = date5.getDayOfYear();
DayOfWeek dayOfWeek = date5.getDayOfWeek();
Month month2 = date5.getMonth();
int monthValue = date5.getMonthValue();
int year2 = date5.getYear();
System.out.println("\n"+dayOfMonth2);
System.out.println(dayOfYear2);
System.out.println(dayOfWeek);
System.out.println(month2);
System.out.println(monthValue);
System.out.println(year2);
// until
LocalDate date6 = LocalDate.now();
Period until = date6.until(LocalDate.now());
System.out.println("\n"+until);
// isBefore, isAfter
LocalDate date7 = LocalDate.now();
LocalDate date8 = LocalDate.of(2019, 05, 22);
boolean before = date7.isBefore(date8);
boolean after = date7.isAfter(date8);
System.out.println("\n"+before);
System.out.println(after);
// isLeapYear
LocalDate date9 = LocalDate.now();
boolean year3 = date9.isLeapYear();
System.out.println("\n"+year3);
}
11.3 Instant 时间戳
Instant主要用于“时间戳”的运算。它是以Unix元年(传统的设定为UTC时区1970年1月1日午夜时分)开始所经历的描述进行运算。
@Test
public void test03(){
Instant instant = Instant.now();
System.out.println(instant);
// 将此瞬间与偏移组合起来创建一个 OffsetDateTime
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println("\n"+offsetDateTime);
// 从第二个开始就从时间线获得纳秒的数量。
int nano = instant.getNano();
System.out.println("\n"+nano);
// 使用从1970-01-01T00:00:00Z的时代开始的秒数获得一个 Instant的实例
Instant epochSecond = Instant.ofEpochSecond(3);
System.out.println("\n"+epochSecond);
// 获得的一个实例 Instant从1970-01-01T00划时代使用毫秒:00:00Z
Instant epochMilli = Instant.ofEpochMilli(3);
System.out.println("\n"+epochMilli);
}
11.4 Duration 和 Period
Duration:用于计算两个“时间”间隔
Period:用于计算两个“日期”间隔
@Test
public void test04(){
Instant now = Instant.now();
// 模拟实际生产环境延迟加载
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
Instant now2 = Instant.now();
// 获取一个 Duration表示两个时间对象之间的持续时间
Duration duration = Duration.between(now, now2);
System.out.println(duration.getSeconds());
LocalDate localDate = LocalDate.now();
LocalDate localDate2 = LocalDate.of(2008, 11, 27);
//获得一个 Period ,由两个日期之间的年数,月份和日期组成
Period period = Period.between(localDate2, localDate);
System.out.println("\n"+period.getYears()); // 获得这段时间的年数
System.out.println(period.getMonths()); // 获取此期间的月数。
System.out.println(period.getDays()); // 获得此期间的天数。
}
11.5 TemporalAdjuster : 时间校正器
有时我们可能需要获取例如:将日期调整到“下个周日”等操作。
@Test
public void test05(){
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);
// 将月份修改为指定的值
LocalDateTime dayOfMonth = localDateTime.withDayOfYear(3);
System.out.println("\n"+dayOfMonth);
// 返回下一个星期的调整器,该调整器将日期调整为在调整日期之后的指定日期的第一次出现
LocalDateTime dateTime = localDateTime.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
System.out.println("\n"+dateTime);
// 实例:获取下一个工作日的日期
LocalDateTime localDateTime3 = localDateTime.with((date) -> { LocalDateTime localDateTime2 = (LocalDateTime) date; DayOfWeek dayOfWeek = localDateTime2.getDayOfWeek(); if(dayOfWeek.equals(DayOfWeek.FRIDAY)){ return localDateTime2.plusDays(3); }else if(dayOfWeek.equals(DayOfWeek.SATURDAY)){ return localDateTime2.plusDays(2); }else{ return localDateTime2.plusDays(1); } }); System.out.println("\n"+localDateTime3); }
11.6 DateTimeFormatter: 解析和格式化
该类提供了三种格式化方法:
预定义的常量,如ISO_LOCAL_DATE
使用模式字母,如uuuu-MMM-dd
使用本地化样式,如long或medium
@Test
public void test06(){
LocalDateTime dateTime = LocalDateTime.now();
// 使用预定义常量
DateTimeFormatter isoLocalDate = DateTimeFormatter.ISO_LOCAL_DATE;
String str = dateTime.format(isoLocalDate);
System.out.println(str);
// 使用模式字母自定义
DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss E");
String str1 = dateTime.format(ofPattern);
System.out.println("\n"+str1);
// 使用本地化
LocalDateTime localDateTime = LocalDateTime.parse(str1, ofPattern);
System.out.println("\n"+localDateTime);
}
11.7.1 时区的处理01
ZoneId:该类中包含了所有的时区信息:
getAvailableZoneIds() : 可以获取所有时区信息
of(id) : 用指定的时区信息获取 ZoneId 对象
@Test
public void test07(){
// 获取所有时区信息
ZoneId.getAvailableZoneIds()
.forEach(System.out::println);
}
11.7.2 时区的处理02
Java8 中加入了对时区的支持,带时区的时间为分别为:
ZonedDate、ZonedTime、ZonedDateTime
其中每个时区都对应着 ID,地区ID都为 “{区域}/{城市}”的格式
例如 :Asia/Shanghai 等
@Test
public void test08(){
// 从默认时区的系统时钟获取当前的日期时间
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println(zonedDateTime);
// 获得时区
ZoneId zone = zonedDateTime.getZone();
System.out.println("\n"+zone);
// 获得指定时区时间
ZonedDateTime zonedDateTime2 = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
System.out.println("\n"+zonedDateTime2);
// 获取指定时区的本地时间
LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of("Asia/Colombo"));
System.out.println("\n"+localDateTime);
}
源码下载地址:https://download.csdn.net/download/hello_world_qwp/10401249
返回首页:https://blog.csdn.net/Hello_World_QWP/article/details/80245129