Java 8 时间和日期 API

简介: Java 8 时间和日期 API


今天我们说说 Java 8 新的时间 API,由于之前的api并不理想也存在问题。所以出现了一套全新的日期API,在java.time路径下。

LocalDate

LocalDate类型包含了年月日信息,下面举些LocalDate的使用示例:

LocalDate date = LocalDate.of(2019, 4, 20); // 2019-07-04
int year = date.getYear(); // 2019
int month = date.getMonth().getValue(); // 7
int day = date.getDayOfMonth(); // 4
// 查看该月有多少天
int days = date.lengthOfMonth(); // 31
// 是否是闰年
boolean isLeap = date.isLeapYear();
// 查看当天 年月日
LocalDate today = LocalDate.now(); // 2019-07-04

除了调用LocalDategetYear方法外,我们也可以使用ChronoField枚举类型来实现相同的功能:

int year1 = date.get(ChronoField.YEAR); // 2019
int month1 = date.get(ChronoField.MONTH_OF_YEAR); // 7
int day1 = date.get(ChronoField.DAY_OF_MONTH); // 4
// 当前日期属于该月第几周
int weekOfMonth = date.get(ChronoField.ALIGNED_WEEK_OF_MONTH); // 1

ChronoField枚举类型包含了诸多的属性可供选择:

1562240029916

修改 LocalDate 对象

LocalDate date3 = LocalDate.of(2018, 4, 20); // 2018-04-20
LocalDate date4 = date3.withDayOfMonth(22); // 2018-04-22
LocalDate date5 = date3.with(ChronoField.DAY_OF_MONTH, 22); // 2018-04-22
LocalDate date6 = date3.withYear(2019); // 2019-04-20
LocalDate date7 = date3.plusDays(5); // 2018-04-25
LocalDate date8 = date3.plus(5, ChronoUnit.DAYS); // 2018-04-25
LocalDate date9 = date3.minusYears(10); // 2008-04-20

TemporalAdjusters类提供了许多静态方法来修改LocalDate对象。当我们需要获取下一个周天,下一个工作日,本月的最后一天等信息时,TemporalAdjusters类便可派上用场:

import static java.time.temporal.TemporalAdjusters.*;
LocalDate date10 = date3.with(nextOrSame(DayOfWeek.MONDAY)); // 2018-04-23
LocalDate date11 = date3.with(lastDayOfMonth()); // 2018-04-30
LocalDate date12 = date3.with(previous(DayOfWeek.SATURDAY)); // 2018-04-14

格式化

String str1 = date.format(DateTimeFormatter.BASIC_ISO_DATE); // 20190704
String str2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE); // 2019-07-04
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String str5 = date.format(dtf); // 2019-07-04
LocalDate date13 = LocalDate.parse(str5, dtf); // 2019-07-04

LocalDate和下面要介绍的LocalTime,LocalDateTime之间共享了许多类似的方法,上面介绍的LocalDate修改、格式化等方法通用适用于LocalTime和LocalDateTime。

LocalTime

LocalTimeLocalDate类似,区别在于LocalTime包含的是时分秒(毫秒)信息。举些LocalTime的例子:

LocalTime time = LocalTime.of(20, 13, 54); // 20:13:54
int hour = time.getHour(); // 20
int minute = time.getMinute(); // 13
int second = time.getSecond(); // 54

LocalDateLocalTime都可以通过字符串来创建:

LocalDate date = LocalDate.parse("2019-04-20");
LocalTime time = LocalTime.parse("20:13:54");

LocalDateTime

LocalDateTimeLocalDateLocalTime的组合形式,包含了年月日时分秒信息。举些LocalDateTime的使用示例:

LocalDateTime ldt1 = LocalDateTime.of(2018, 4, 20, 20, 13, 54); // 2018-04-20T20:13:54
LocalDateTime ldt2 = LocalDateTime.of(date, time); // 2019-04-20T20:13:54

LocalDateTime可以转换为LocalDateLocalTime,转换后包含的信息减少了:

LocalDate date1 = ldt1.toLocalDate(); // 2019-04-20
LocalTime time1 = ldt1.toLocalTime(); // 20:13:54

Duration

Duration用于计算两个LocalTime或者LocalDateTime的时间差,例如:

LocalTime time2 = LocalTime.of(23, 59, 59);
Duration duration = Duration.between(time1, time2);
long seconds = duration.getSeconds(); // 13565

time1和time2之间相差了13565秒。

手动创建Duration对象:

Duration threeMinutes = Duration.ofMinutes(3);
threeMinutes = Duration.of(3, ChronoUnit.MINUTES); // 创建了一个3分钟的Duration,两种创建方式等价

Period

Period用于计算两个LocalDate之间的时长。举些例子:

LocalDate date2 = LocalDate.of(2018, 5, 21);
Period period = Period.between(date1, date2);
int monthsBetween = period.getMonths(); // 1
int daysBetween = period.getDays(); // 1

2018-04-21和2018-04-20之间月份相差1,天数相差1。

同样的,我们也可以手动创建Period对象:

Period tenDays = Period.ofDays(10);
Period threeWeeks = Period.ofWeeks(3);
Period twoYearsSixMonthsOneDay = Period.of(2, 6, 1);

比较两个时间的先后

LocalDate date15 = LocalDate.of(2018,4,21);
date.isEqual(date15); // false
date.isAfter(date15); // false
date.isBefore(date15); // true

MonthDay 使用

MonthDay只包含月日信息,可以用于存放类似于生日,结婚纪念日等信息。举个使用MonthDay的例子:

LocalDate birthday = LocalDate.of(1999, 9, 9);
MonthDay monthDay = MonthDay.of(birthday.getMonth(), birthday.getDayOfMonth());
MonthDay currentMonthDay = MonthDay.from(LocalDate.now());
if (currentMonthDay.equals(monthDay)) {
    System.out.println("happy birthday!");
}

假如用户的生日是1999年9月9号,那么可以通过这种方法来判断今天是否是用户的生日,如果是的话便发送生日祝福。同样的也有YearMonth类,只包含 年月信息。就不啰嗦了。


相关文章
|
2天前
|
存储 Java 关系型数据库
掌握Java 8 Stream API的艺术:详解流式编程(一)
掌握Java 8 Stream API的艺术:详解流式编程
9 1
|
5天前
|
Java BI
Java 获取周,月,年日期集合(统计图)
Java 获取周,月,年日期集合(统计图)
Java 获取周,月,年日期集合(统计图)
|
7天前
|
Java
java判断时间是否为节假日(或指定的日期),是的话返回true,否返回false
java判断时间是否为节假日(或指定的日期),是的话返回true,否返回false
18 0
|
12天前
|
前端开发 Java API
构建RESTful API:Java中的RESTful服务开发
【4月更文挑战第3天】本文介绍了在Java环境中构建RESTful API的重要性及方法。遵循REST原则,利用HTTP方法处理资源,实现CRUD操作。在Java中,常用框架如Spring MVC简化了RESTful服务开发,包括定义资源、设计表示层、实现CRUD、考虑安全性、文档和测试。通过Spring MVC示例展示了创建RESTful服务的步骤,强调了其在现代Web服务开发中的关键角色,有助于提升互操作性和用户体验。
构建RESTful API:Java中的RESTful服务开发
|
21天前
|
Java 数据库连接 API
Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API
Java 是一种广泛使用的、面向对象的编程语言,始于1995年,以其跨平台性、安全性和可靠性著称,应用于从移动设备到数据中心的各种场景。基础概念包括变量(如局部、实例和静态变量)、数据类型(原始和非原始)、条件语句(if、else、switch等)、函数、循环、异常处理、数据结构(如数组、链表)和面向对象编程(类、接口、继承等)。深入学习还包括包、内存管理、集合框架、序列化、网络套接字、泛型、流、JVM、垃圾回收和线程。构建工具如Gradle、Maven和Ant简化了开发流程,Web框架如Spring和Spring Boot支持Web应用开发。ORM工具如JPA、Hibernate处理对象与数
87 3
|
22天前
|
分布式计算 Java 程序员
Java 8新特性之Lambda表达式与Stream API
本文将详细介绍Java 8中的两个重要新特性:Lambda表达式和Stream API。Lambda表达式是Java 8中引入的一种简洁、匿名的函数表示方法,它允许我们将函数作为参数传递给其他方法。而Stream API则是一种新的数据处理方式,它允许我们以声明式的方式处理数据,从而提高代码的可读性和可维护性。通过本文的学习,你将能够掌握Lambda表达式和Stream API的基本用法,以及如何在项目中应用这两个新特性。
28 10
|
23天前
|
Java API 数据处理
Java 8新特性之Lambda表达式与Stream API
本文将介绍Java 8中的两个重要特性:Lambda表达式和Stream API。Lambda表达式是一种新的语法结构,允许我们将函数作为参数传递给方法。而Stream API则是一种处理数据的新方式,它允许我们对数据进行更简洁、更高效的操作。通过学习这两个特性,我们可以编写出更简洁、更易读的Java代码。
|
SQL 存储 JSON
ElasticSearch 查询与 Java API 实践(下)
ElasticSearch 查询与 Java API 实践
816 0
ElasticSearch 查询与 Java API 实践(下)
|
存储 Java 数据建模
ElasticSearch 查询与 Java API 实践(中)
ElasticSearch 查询与 Java API 实践
264 0
ElasticSearch 查询与 Java API 实践(中)
|
自然语言处理 算法 数据建模
ElasticSearch 查询与 Java API 实践(上)
ElasticSearch 查询与 Java API 实践
290 0
ElasticSearch 查询与 Java API 实践(上)