第十一章 容器类&新日期时间
11.1、Optional 容器类
11.1.1、概述
Optional 类是一个容器类,代表一个值存在或不存在, 原来用 null 表示一个值不存在,现在 Optional类 可以更好的表达这个概念并且可以避免空指针异常
11.1.2、常用方法
import java.util.Optional;
public class Main {
public static void main(String[] args) {
// 创建一个 Optional 实例
Optional<String> op1 = Optional.of("Hello,World");
// 创建一个空的 Optional 实例
Optional<Object> op2 = Optional.empty();
// 若参数不为 null,创建 Optional 实例,否则创建空实例
Optional<Object> op3 = Optional.ofNullable(null);
// 判断是否包含值
boolean isPresent = op1.isPresent();
System.out.println(isPresent);
// 如果调用对象包含值,返回该值,否则返回参数
Object orElse = op2.orElse("Hello,World");
System.out.println(orElse);
// 如果调用对象包含值,返回该值,否则返回 s 获取的值
Object orElseGet = op3.orElseGet(() -> 10 + 20);
System.out.println(orElseGet);
// 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
Optional<String> op4 = op1.map((s) -> s.toUpperCase());
System.out.println(op4.get());
}
}
11.2、新日期时间
11.2.1、概述
Java 的 java.util.Date 和 java.util.Calendar 类易用性差,不支持时区,而且都不是线程安全的,Java 8的日期和时间类包含 LocalDate、LocalTime、LocalDateTime、Instant、Duration 以及 Period,这些类都包含在 java.time 包中,它们是线程安全的,LocalDate 只会获取年月日,LocalTime 只会获取时分秒,LocalDateTime 获取年月日时分秒,相当于 LocalDate + LocalTime,推荐使用LocalDateTime
11.2.2、LocalDate类
描述:本地日期,可以获取年、月、日、星期几
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.temporal.ChronoField;
public class Main {
public static void main(String[] args) {
// 静态方法,获取当前年月日
LocalDate localDate = LocalDate.now();
// 静态方法,构造指定年月日
LocalDate localDate1 = LocalDate.of(2019, 9, 12);
// 获取年、月、日、星期几
int year = localDate.getYear();
Month month = localDate.getMonth();
int day = localDate.getDayOfMonth();
DayOfWeek dayOfWeek = localDate.getDayOfWeek();
System.out.println(year);
System.out.println(month);
System.out.println(day);
System.out.println(dayOfWeek);
System.out.println("----------");
// 获取年、月、日、星期几
int year1 = localDate.get(ChronoField.YEAR);
int month1 = localDate.get(ChronoField.MONTH_OF_YEAR);
int day1 = localDate.get(ChronoField.DAY_OF_MONTH);
int dayOfWeek1 = localDate.get(ChronoField.DAY_OF_WEEK);
System.out.println(year1);
System.out.println(month1);
System.out.println(day1);
System.out.println(dayOfWeek1);
}
}
11.2.3、LocalTime类
描述:本地时间,可以获取时、分、秒
import java.time.LocalTime;
import java.time.temporal.ChronoField;
public class Main {
public static void main(String[] args) {
// 静态方法,获取当前时分秒
LocalTime localTime = LocalTime.now();
// 静态方法,获取指定时分秒
LocalTime localTime1 = LocalTime.of(14, 14, 14);
// 获取时、分、秒
int hour = localTime.getHour();
int minute = localTime.getMinute();
int second = localTime.getSecond();
System.out.println(hour);
System.out.println(minute);
System.out.println(second);
System.out.println("----------");
// 获取时、分、秒
int hour1 = localTime.get(ChronoField.HOUR_OF_DAY);
int minute1 = localTime.get(ChronoField.MINUTE_OF_HOUR);
int second1 = localTime.get(ChronoField.SECOND_OF_MINUTE);
System.out.println(hour1);
System.out.println(minute1);
System.out.println(second1);
System.out.println("----------");
}
}
11.2.4、LocalDateTime类
描述:本地日期时间,可以获取年、月、日、时、分、秒、纳秒
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class Main {
public static void main(String[] args) {
// 静态方法,根据当前时间创建对象
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
System.out.println("----------");
// 静态方法,根据指定时间创建对象
LocalDateTime ld2 = LocalDateTime.of(2015, 10, 10, 01, 02, 03);
System.out.println(ld2);
System.out.println("----------");
/**
* plusYears plusMonths plusWeeks plusDays
*/
LocalDateTime ldt3 = ld2.plusYears(20);
System.out.println(ldt3);
System.out.println("----------");
/**
* minusYears minusMonths minusWeeks minusDays
*/
LocalDateTime ldt4 = ld2.minusMonths(2);
System.out.println(ldt4);
System.out.println("----------");
System.out.println(ldt.getYear());// 年
System.out.println(ldt.getMonthValue());// 月
System.out.println(ldt.getDayOfMonth());// 日
System.out.println(ldt.getHour());// 时
System.out.println(ldt.getMinute());// 分
System.out.println(ldt.getSecond());// 秒
System.out.println(ldt.getNano());// 纳秒
System.out.println("----------");
// 获取LocalDate
LocalDate localDate = ldt.toLocalDate();
System.out.println(localDate.now());
System.out.println("----------");
// 获取LocalTime
LocalTime localTime = ldt.toLocalTime();
System.out.println(localTime.now());
System.out.println("----------");
}
}
11.2.5、Instant类
描述:时间戳,可以获取秒、毫秒、纳秒
import java.time.Instant;
public class Main {
public static void main(String[] args) {
// 创建Instant对象
Instant instant = Instant.now();
// 获取秒数
long currentSecond = instant.getEpochSecond();
System.out.println(currentSecond);
// 获取毫秒数
long currentMilli = instant.toEpochMilli();
System.out.println(currentMilli);
// 获取纳秒数
int currentNano = instant.getNano();
System.out.println(currentNano);
}
}
11.2.6、Period类
描述:用于计算两个“日期”间隔,可以获取年、月、天、总月
import java.time.LocalDate;
import java.time.Period;
public class Main {
public static void main(String[] args) {
LocalDate ld1 = LocalDate.now();
LocalDate ld2 = LocalDate.of(2020, 1, 21);
Period period = Period.between(ld2, ld1);
int years = period.getYears();
int months = period.getMonths();
int days = period.getDays();
long totalMonths = period.toTotalMonths();
System.out.println(years);// 年
System.out.println(months);// 月
System.out.println(days);// 天
System.out.println(totalMonths);// 总月
}
}
11.2.7、Duration类
描述:用于计算两个“时间”间隔,可以获取天、时、时、分、秒、毫秒、纳秒
import java.time.Duration;
import java.time.Instant;
public class Main {
public static void main(String[] args) {
Instant ins1 = Instant.now();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Instant ins2 = Instant.now();
Duration duration = Duration.between(ins1, ins2);
long days = duration.toDays();// 天
long hours = duration.toHours();// 时
long minutes = duration.toMinutes();// 分
long seconds = duration.getSeconds();// 秒
long millis = duration.toMillis();// 毫秒
long nanos = duration.toNanos();// 纳秒
System.out.println(days);
System.out.println(hours);
System.out.println(minutes);
System.out.println(seconds);
System.out.println(millis);
System.out.println(nanos);
}
}
11.2.8、时间校正器
描述:TemporalAdjusters 包含许多静态方法,可以直接调用
方法名 | 描述 |
---|---|
dayOfWeekInMonth | 返回同一个月中每周的第几天 |
firstDayOfMonth | 返回当月的第一天 |
firstDayOfNextMonth | 返回下月的第一天 |
firstDayOfNextYear | 返回下一年的第一天 |
firstDayOfYear | 返回本年的第一天 |
firstInMonth | 返回同一个月中第一个星期几 |
lastDayOfMonth | 返回当月的最后一天 |
lastDayOfNextMonth | 返回下月的最后一天 |
lastDayOfNextYear | 返回下一年的最后一天 |
lastDayOfYear | 返回本年的最后一天 |
lastInMonth | 返回同一个月中最后一个星期几 |
next / previous | 返回后一个/前一个给定的星期几 |
nextOrSame / previousOrSame | 返回后一个/前一个给定的星期几,如果这个值满足条件,直接返回 |
import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.Month;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
public class Main {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.of(2020, Month.JULY, 21, 12, 30, 32);
// 增加一年
localDateTime = localDateTime.plusYears(1);
localDateTime = localDateTime.plus(1, ChronoUnit.YEARS);
System.out.println(localDateTime);
System.out.println("----------");
// 减少一年
localDateTime = localDateTime.minusYears(1);
localDateTime = localDateTime.minus(1, ChronoUnit.YEARS);
System.out.println(localDateTime);
System.out.println("----------");
// 指定年份
localDateTime = localDateTime.withYear(2020);
localDateTime = localDateTime.with(ChronoField.YEAR, 2020);
System.out.println(localDateTime);
System.out.println("----------");
// 获取该年的第一天
localDateTime = localDateTime.with(TemporalAdjusters.firstDayOfYear());
System.out.println(localDateTime);
System.out.println("----------");
// 自定义:下一个工作日
localDateTime = localDateTime.with((l) -> {
LocalDateTime ldt = (LocalDateTime) l;
DayOfWeek dow = ldt.getDayOfWeek();
if (dow.equals(DayOfWeek.FRIDAY)) {
return ldt.plusDays(3);
} else if (dow.equals(DayOfWeek.SATURDAY)) {
return ldt.plusDays(2);
} else {
return ldt.plusDays(1);
}
});
System.out.println(localDateTime);
System.out.println("----------");
}
}
11.2.9、格式化时间
描述:通过localDate.format方法格式化,格式可以是内置的也可以是自定义的
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
LocalDate localDate = LocalDate.of(2020, 05, 05);
// 内置格式
String s1 = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE);
System.out.println(s1);
// 自定义格式
String s2 = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println(s2);
}
}
11.2.10、解析时间
描述:通过LocalDate.parse方法解析,格式可以是内置的也可以是自定义的
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
// 内置格式
LocalDate localDate1 = LocalDate.parse("2019-09-12", DateTimeFormatter.ISO_LOCAL_DATE);
System.out.println(localDate1);
// 自定义格式
LocalDate localDate2 = LocalDate.parse("2019-09-12", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println(localDate2);
}
}
11.2.11、带时区的日期或时间
描述:ZonedDate、ZonedTime、ZonedDateTime
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
System.out.println(zdt);
}
}
第十一章 容器类&新日期时间的更多相关文章
- Java 8 新日期时间 API
Java 8 新日期时间 API 1. LocalDate.LocalTime.LocalDateTime LocalDate.LocalTime.LocalDateTime 实例是不可变的对象,分别 ...
- jdk1.8新日期时间类(DateTime、LocalDateTime)demo代码
//获取当前时间 LocalDateTime d0 = LocalDateTime.now(); System.out.println(DataConvertUtil.localDateTimeToS ...
- Java8新特性探索之新日期时间库
一.为什么引入新的日期时间库 Java对日期,日历及时间的处理一直以来都饱受诟病,尤其是它决定将java.util.Date定义为可修改的以及将SimpleDateFormat实现成非线程安全的. 关 ...
- jdk8环境下sprngboot/springmvc中JSR310新日期/时间类LocalDateTime显示效果带T
如图所示: 日期时间类中带了一个T,以上这种格式LocalDateTime格式化的时候默认日期时间格式:ISO.DATE_TIME(按笔者目前的知识理解是ISO8601规范中的日期时间格式化) 想要把 ...
- JDK8中新日期时间API
它们面临的问题是:可变性:像日期和时间这样的类应该是不可变的.偏移性:Date中的年份是从1900开始的,而月份都从0开始.格式化:格式化只对Date有用,Calendar则不行.此外,它们也不是线程 ...
- Linux内核设计与实现 总结笔记(第十一章)定时器和时间管理
时间管理在内核中占用非常重要的地位,内核中有大量的函数都需要基于时间驱动的,内核对相对时间和绝对时间都非常需要. 一.内核中的时间概念 内核必须在硬件的帮助下才能计算和管理时间,系统定时器以某种频率自 ...
- springboot Thymeleaf中格式化jsr310新日期时间类(LocalDateTime,LocalDate)--thymeleaf格式化LocalDateTime,LocalDate等JDK8新时间类
依赖maven包 <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>th ...
- 《Java 8实战》读书笔记系列——第三部分:高效Java 8编程(四):使用新的日期时间API
https://www.lilu.org.cn/https://www.lilu.org.cn/ 第十二章:新的日期时间API 在Java 8之前,我们常用的日期时间API是java.util.Dat ...
- java8_api_日期时间
日期时间处理 Date类,其中很多方法已经不用了 Calendar类,java.util包中的抽象类 Date类,其对象代表即时时间,存储的是从19700101000000距 ...
随机推荐
- 不就是语法和长难句吗—笔记总结Day1
CONTENTS 第一课 简单句 第二课 并列句 第三课 名词(短语)和名词性从句 第四课 定语和定语从句 第五课 状语和状语从句 第六课 英语的特殊结构 第一课 奋斗的开始——简单句 一.什么是英语 ...
- Erlang模块inet翻译
模块 inet 模块概述 访问TCP / IP协议. 描述 此模块提供对TCP/IP协议的访问. 另请参阅<ERTS用户指南:Inet配置>,以获取有关如何配置用于IP通信的Erlang运 ...
- 【XJOI】NOIP2020模拟训练题2 总结
得分情况: 估分: 30(T1)+100(T2)+0(T3)=130; 实际: 30(T1)+60(T2)+10(T3)=100; QAQ 是我高看自己了 T1 友好数对: 题意: 如果一个 ...
- Electron + Websoket 通讯
Electron + WebSocket + node.js 通信 描述 本文主要介绍了结合 Electron 和 node.js 进行 Websocket 通讯的一个简单例子. 项目结构 main. ...
- 石子合并——区间dp
石子合并(3种变形) <1> 题目: 有N堆石子排成一排(n<=100),现要将石子有次序地合并成一堆,规定每次只能选相邻的两堆合并成一堆,并将新的一堆的石子数,记为改次合并的得分, ...
- ICPC 2018 亚洲横滨赛 C Emergency Evacuation(暴力,贪心)
ICPC 2018 亚洲横滨赛 C Emergency Evacuation 题目大意 你一个车厢和一些人,这些人都坐在座位上,求这些人全部出去的时间最小值 Solution 题目咋说就咋做 直接模拟 ...
- Docker容器和镜像的区别
docker容器和镜像区别 转自 https://www.cnblogs.com/bethal/p/5942369.html 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(conta ...
- day22 常用模块(上)
一.时间模块 1 time模块 获取时间的三种格式: 第一种:time.time() 时间戳(timestamp):从1970年到现在的秒数 #应用场景:计算时间差 可以对时间加减,返回值为浮点型 p ...
- 最新MySQL入门篇
一.SQL简介 SQL:结构化查询语言(Structured Query Language),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系 ...
- mysql 漏洞利用与提权
判断MySQL服务运行的权限 1.查看系统账号,如果出现MySQL这类用户,意味着系统可能出现了降权. 2.看mysqld运行的priority值. 3.查看端口是否可外联. MySQL密码获取与破解 ...