第十一章 容器类&新日期时间
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距 ...
随机推荐
- 通俗易懂的阿里Sentinel源码分析:如何向控制台发送心跳包?
源码分析 public class Env { public static final Sph sph = new CtSph(); static { // 在Env类的静态代码块中, // 触发了一 ...
- rhel7 rpmbuild 制作二进制程序安装包(.rpm) 简单示例
下载rpm-build: # yum install rpm-build 如果上述方式无法安装(没配置网络源,虚拟机下是安装媒介源) 可以用下列方式下载后再安装(实践结果可能版本问题引起的缺少太多的* ...
- Java 内存分析之mat安装
有三款内存分析的工具 免费 VisualVM MAT 下载地址https://www.eclipse.org/mat/ mac 下面 under the current working directo ...
- 附007.Docker全系列大总结
Docker全系列总结如下,后期不定期更新. 欢迎基于学习.交流目的的转载和分享,禁止任何商业盗用,同时希望能带上原文出处,尊重ITer的成果,也是尊重知识. 若发现任何错误或纰漏,留言反馈或右侧添加 ...
- 苹果手机history.back()返回不刷新问题
苹果手机,a页面打开b页面,b页面使用history.back(-1)返回a页面时,a页面不刷新,可在a页面添加以下代码: var isPageHide = false; window.addEven ...
- cf1216E2 Numerical Sequence (hard version)(思维)
cf1216E2 Numerical Sequence (hard version) 题目大意 一个无限长的数字序列,其组成为\(1 1 2 1 2 3 1.......1 2 ... n...\), ...
- 【线型DP】CF1012C Hills 小山坡
来了来了. 题目: 给你n个数,你一次操作可以把某一个数-1(可以减为负数),你的目标是使任意的k个数严格小于它旁边的两个数(第一个数只用严格小于第二个数,第n个数只用严格小于第n-1个数),问最少需 ...
- NW.js Mac App 签名公证流程
使用 Developer ID 为 Mac 软件签名 - Apple Developer 在MacOS 10.15之前,应用如果没有签名(signature),那么首次打开时就会弹出"无法验 ...
- electron自定义最小化,最大化和关闭按钮
Electron ipcRenderer 模块 ipcRenderer 模块是一个 EventEmitter 类的实例. 它提供了有限的方法,你可以从渲染进程向主进程发送同步或异步消息. 也可以收到主 ...
- TB6560电机驱动器参数设置
TB6560电机驱动器参数设置 最近接触了一些步进电机的开发,整理了一些参数设置的经验,希望能帮助到有需要的人儿~ 步进电机主要按一定的给电规律,给对应的绕组响应的电信号,电机将按一定的方向运行,而且 ...