日期和时间API - 读《Java 8实战》

日期与时间
LocalDate
创建一个LocalDate对象并读取其值
// 根据年月日创建日期
LocalDate date1 = LocalDate.of(2014, 3, 18);
// 读取
System.out.println(date1.getYear()); // 2014
System.out.println(date1.getMonth()); // MARCH
System.out.println(date1.getMonth().getValue()); // 3
System.out.println(date1.getDayOfMonth()); // 18
System.out.println(date1.lengthOfMonth()); // 31
System.out.println(date1.isLeapYear()); // false
// 当前日期
LocalDate now = LocalDate.now();
System.out.println(now); // 2018-08-14
// 从日期对象中获取年月日
System.out.println(now.get(ChronoField.YEAR)); // 2018
System.out.println(now.get(ChronoField.MONTH_OF_YEAR)); // 8
System.out.println(now.get(ChronoField.DAY_OF_MONTH)); // 14
LocalTime
创建LocalTime并读取值
// 根据时分秒创建时间
LocalTime time1 = LocalTime.of(13, 45, 20);
System.out.println(time1.getHour()); // 13
System.out.println(time1.getMinute()); // 45
System.out.println(time1.getSecond()); // 20
// 通过日期或时间字符串创建日期或时间
LocalDate date2 = LocalDate.parse("2014-03-18");
LocalTime time2 = LocalTime.parse("13:45:20");
LocalDateTime
直接创建LocalDateTime对象或通过合并日期和时间的方式创建
// 直接创建日期时间
LocalDateTime lt1 = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20);
// 通过日期和时间创建
LocalDate date1 = LocalDate.of(2014, 3, 18);
LocalTime time1 = LocalTime.of(13, 45, 20);
LocalDateTime lt2 = LocalDateTime.of(date1, time1);
LocalDateTime lt3 = date1.atTime(13, 45, 20);
LocalDateTime lt4 = date1.atTime(time1);
LocalDateTime lt5 = time1.atDate(date1);
// 从日期时间中提取日期和时间
LocalDate date2 = lt1.toLocalDate();
LocalTime time2 = lt1.toLocalTime();
Instant
机器的日期和时间格式
// 获取当前时刻时间戳
System.out.println(Instant.now().toEpochMilli()); // 1534255959679
时间段
Duration & Period
Druation时间间隔单位是时分秒,Period时间间隔单位年月日
创建Duration和Period对象
LocalDate date1 = LocalDate.parse("2018-08-12");
LocalDate date2 = LocalDate.parse("2018-08-11");
LocalTime time1 = LocalTime.parse("12:45:20");
LocalTime time2 = LocalTime.parse("12:45:21");
Instant instant1 = Instant.ofEpochSecond(22);
Instant instant2 = Instant.ofEpochSecond(11);
// 时间间隔是时间秒
Duration d2 = Duration.between(time1, time2); // time2 - time1
Duration d3 = Duration.between(instant1, instant2); // instant2 - instant1
Duration d4 = Duration.ofMinutes(3); // 创建一个3分钟的时间段
System.out.println(d2.getSeconds()); // 1
System.out.println(d4.getSeconds()); // 180
// 时间间隔是年月日
Period p1 = Period.between(date1, date2); // date2 - date1
Period p2 = Period.ofDays(10);
System.out.println(p1.getDays()); // -1
System.out.println(p2.getDays()); // 10
操纵、解析和格式化日期
修改LocalDate对象属性
LocalDate date1 = LocalDate.of(2014, 3, 18);
// 以比较直观的方式修改
LocalDate date1 = date1.withYear(2011); // 修改年
LocalDate date1 = date1.withMonth(11); // 修改月
LocalDate date1 = date1.withDayOfMonth(25); // 修改日
// 以相对方式修改
date1.minusYears(1); // 减1年
date1.plusYears(2); // 加2年
date1.plus(3, ChronoUnit.MONTHS); // 加3月
date1.plus(22, ChronoUnit.DAYS); // 加22天
TemporalAdjuster
LocalDate date1 = LocalDate.of(2014, 3, 18);
// 当前日期之后包括当前日期的第一个星期日
System.out.println(date1.with(nextOrSame(DayOfWeek.SUNDAY))); // 2014-03-23
// 当月第一个星期日
System.out.println(date1.with(firstInMonth(DayOfWeek.SUNDAY))); // 2014-03-02
// 当月最后一个星期日
System.out.println(date1.with(lastInMonth(DayOfWeek.SUNDAY))); // 2014-03-30
// 当月第一天
System.out.println(date1.with(firstDayOfMonth())); // 2014-03-01
// 当月最后一天
System.out.println(date1.with(lastDayOfMonth())); // 2014-03-31
// 当年第一天
System.out.println(date1.with(firstDayOfYear())); // 2014-01-01
// 明年第一天
System.out.println(date1.with(firstDayOfNextYear())); // 2015-01-01
定制一个TemopralAdjuster
求下一个工作日
当前日期如果是周日到周四,日期向后移1天
当前日期如果是周五或周六,日期移到下周一
方案一:实现一个TemporalAdjuster类
public class NextWorkingDay implements TemporalAdjuster {
@Override
public Temporal adjustInto(Temporal temporal) {
// 当前日期是周几
DayOfWeek dow =
DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
// 判断要向后移几天
int dayToAdd = 1;
if (dow == DayOfWeek.FRIDAY) dayToAdd = 3;
else if (dow == DayOfWeek.SATURDAY) dayToAdd = 2;
return temporal.plus(dayToAdd, ChronoUnit.DAYS);
}
}
方案二:直接使用Lambda使用
LocalDate nextWorkingDate = LocalDate.now()
.with(temporal -> {
// 当前日期是周几
DayOfWeek dow =
DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
// 判断要向后移几天
int dayToAdd = 1;
if (dow == DayOfWeek.FRIDAY) dayToAdd = 3;
else if (dow == DayOfWeek.SATURDAY) dayToAdd = 2;
return temporal.plus(dayToAdd, ChronoUnit.DAYS);
});
方案三:使用Lambda实现一个TemporalAdjuster
TemporalAdjuster nextWorkingDay = TemporalAdjusters.ofDateAdjuster(
temporal -> {
// 当前日期是周几
DayOfWeek dow =
DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
// 判断要向后移几天
int dayToAdd = 1;
if (dow == DayOfWeek.FRIDAY) dayToAdd = 3;
else if (dow == DayOfWeek.SATURDAY) dayToAdd = 2;
return temporal.plus(dayToAdd, ChronoUnit.DAYS);
}
);
输出及解析日期时间对象
LocalDate date1 = LocalDate.of(2014, 3, 18);
System.out.println(date1.format(DateTimeFormatter.BASIC_ISO_DATE)); // 20140318
System.out.println(date1.format(DateTimeFormatter.ISO_LOCAL_DATE)); // 2014-03-18
LocalDate date2 = LocalDate.parse("20140318", DateTimeFormatter.BASIC_ISO_DATE);
LocalDate date3 = LocalDate.parse("2014-03-18", DateTimeFormatter.ISO_LOCAL_DATE);
// 按照某个模式创建DateTimeFormatter
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
System.out.println(date1.format(formatter)); // 2014/03/18
LocalDate date4 = LocalDate.parse("2018/08/14", formatter);
// 创建一个本地化的DateTimeFormatter
DateTimeFormatter italianFormatter =
DateTimeFormatter.ofPattern("d. MMMM yyyy", Locale.ITALIAN);
System.out.println(date1.format(italianFormatter)); // 18. marzo 2014
LocalDate date5 = LocalDate.parse("18. marzo 2014", italianFormatter);
时区与历法
ZoneId
// 打印所有时区
ZoneId.getAvailableZoneIds().stream()
.forEach(System.out::println);
// 创建一个时区,格式为{区域}/{城市}
ZoneId romeZone = ZoneId.of("Europe/Rome");
// 将老的时区对象转换为ZoneId
ZoneId newZoneId = TimeZone.getDefault().toZoneId();
// 获取当前时区
ZoneId defaultZoneId = ZoneId.systemDefault();
System.out.println(defaultZoneId); // Asia/Shanghai
ZonedDateTime
为时间点添加时区信息
ZoneId romeZone = ZoneId.of("Europe/Rome");
// 为时间点添加时区信息
LocalDate date1 = LocalDate.now();
ZonedDateTime zdt1 = date1.atStartOfDay(romeZone);
LocalDateTime dateTime1 = LocalDateTime.now();
ZonedDateTime zdt2 = dateTime1.atZone(romeZone);
Instant instant1 = Instant.now();
ZonedDateTime zdt3 = instant1.atZone(romeZone);
// 将LocalDateTime转换为Instant
Instant instantFromDateTime = dateTime1.toInstant(ZoneOffset.ofHours(0));
// 将Instant转换为LocalDateTime
LocalDateTime dateTimeFromInstant = LocalDateTime.ofInstant(instant1, romeZone);
ZoneOffset
利用和UTC/格林尼治时间的固定偏差计算时区
// 不推荐使用
// 纽约落后于伦敦5小时
ZoneOffset newYorkOffset = ZoneOffset.of("-05:00");
System.out.println(newYorkOffset);
OffsetDateTime dateTimeInNewYork = OffsetDateTime.of(LocalDateTime.now(), newYorkOffset);
别的日历系统
ISO-8601日历系统是世界文明日历系统的事实标准。Java 8 还提供了4种其他日历系统,分别是
ThaiBuddhistDate
MinguoDate
JapaneseDate
HijrahDate // 伊斯兰教日历
所有这些类以及LocalDate都实现了ChronoLocalDate接口。
LocalDate date1 = LocalDate.now();
JapaneseDate japaneseDate = JapaneseDate.from(date1);
System.out.println(japaneseDate); // Japanese Heisei 30-08-14
Chronology japaneseChronology = Chronology.ofLocale(Locale.JAPAN);
ChronoLocalDate now = japaneseChronology.dateNow();
System.out.println(now); // 2018-08-14
日期和时间API - 读《Java 8实战》的更多相关文章
- 计算机程序的思维逻辑 (95) - Java 8的日期和时间API
本节继续探讨Java 8的新特性,主要是介绍Java 8对日期和时间API的增强,关于日期和时间,我们在之前已经介绍过两节了,32节介绍了Java 1.8以前的日期和时间API,主要的类是Date和 ...
- Java编程的逻辑 (95) - Java 8的日期和时间API
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- Java 8 (11) 新的日期和时间API
在Java 1.0中,对日期和时间的支持只能依赖java.util.Date类.这个类只能以毫秒的精度表示时间.这个类还有很多糟糕的问题,比如年份的起始选择是1900年,月份的起始从0开始.这意味着你 ...
- java 8中新的日期和时间API
java 8中新的日期和时间API 使用LocalDate和LocalTime LocalDate的实例是一个不可变对象,它只提供了简单的日期,并不含当天的时间信息.另外,它也不附带任何与时区相关的信 ...
- 《Java 8 in Action》Chapter 12:新的日期和时间API
在Java 1.0中,对日期和时间的支持只能依赖java.util.Date类.同时这个类还有两个很大的缺点:年份的起始选择是1900年,月份的起始从0开始. 在Java 1.1中,Date类中的很多 ...
- Java8系列 (六) 新的日期和时间API
概述 在Java8之前, 我们一般都是使用 SimpleDateFormat 来解析和格式化日期时间, 但它是线程不安全的. @Test public void test() { SimpleDate ...
- Java8 日期与时间 API
在 Java 中,想处理日期和时间时,通常都会选用 java.util.Date 这个类进行处理.不过不知道是设计者在当时没想好还是其它原因,在 Java 1.0 中引入的这个类,大部分的 API 在 ...
- 详解Java8的日期和时间API
详解Java8的日期和时间API 在JDK1.0的时候,Java引入了java.util.Date来处理日期和时间:在JDK1.1的时候又引入了功能更强大的java.util.Calendar,但是C ...
- Day029 JDK8中新日期和时间API (二)
# JDK8中新日期和时间API (二) Instant介绍 Instant:时间线上的一个瞬时点. 这可能被用来记录应用程序中的事件时间 戳. 在处理时间和日期的时候,我们通常会想到年,月,日,时, ...
随机推荐
- 前端调试利器 - Charles
Docs 开发之 Charles 配置指南 1.下载与安装 charles-proxy-4.1.4 .dmg56.12 MB已存到云盘下载 2.激活 使用公司正版license 激活 安装证书 点击证 ...
- java中接口到底是干什么的,怎么用,深入剖析
6.总结性深一层次综合剖析接口概念[新手可忽略不影响继续学习] 通过以上的学习, 我们知道,所有定义在接口中的常量都默认为public.static和final.所有定义在接口中的方法默认为publi ...
- Android优化应用启动速度
一.应用的启动 启动方式 通常来说,在安卓中应用的启动方式分为两种:冷启动和热启动. 1.冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动 ...
- 浅谈ES6中的Class
转载地址:https://www.cnblogs.com/sghy/p/8005857.html 一.定义类(ES6的类,完全可以看做是构造函数的另一种写法) class Greet { constr ...
- 腾讯云服务nginx部署静态项目
一直想要搭建自己的blog,买了基础云服务器练手 文章内容是根据腾讯文档(https://cloud.tencent.com/document/product/213/2131)总结 部署静态页面归纳 ...
- 动态div点击事件传递对象参数格式-草稿889
<button type='button' style='border: 1px solid #eeeeee;color: #717070;height: 20px;border-radius: ...
- python修改Gsettings的配置文件
GSettings 的配置文件是 xml 格式的,文件需以 .gschema.xml 结尾,文件名通常与 id 相同.配置文件安装在 /usr/share/glib-2.0/schemas/ 目录下, ...
- springboot+springsecurity+mybatis plus之用户认证
一.权限管理的概念 另一个安全框架shiro:shiro之权限管理的描述 导入常用坐标 <dependency> <groupId>org.springframework.bo ...
- Struts2-Action的基本流程
1.浏览器发送HTTP请求 2.Web容器调用Struts2过滤器的doFilter()方法 3.通过Struts2的内部处理机制,判断HTTP请求是否与某个Action对象匹配 4.如果有与之匹配的 ...
- Go xmas2020 学习笔记 00-03、Basic Types
00-02-Hello Example. 目录结构. 不一样的Hello World. 巧妙的单元测试. 传入os.Args切片. go mod init. 03-Basic Types. 变量类型与 ...