使用LocalDate,LocalTime和LocalDateTime

Java 8对日期和时间API进行了重大更改,这是在JSR 310:日期和时间API的 JDK中包括了Joda Time API 。 此JSR由Joda Time的创建者Stephen Colebourne领导。

有许多惊人的API可用于日期和时间。 在本文中,我将介绍最常用的: java.time.LocalDatejava.time.LocalTimejava.time.LocalDateTime 。 这些代表独立于时区的日期和时间值。 因此,它们依靠系统时钟来捕获值。

创建一个实例

让我们来看看使用创建它们的实例的方式now()方法和工厂方法of()

jshell> LocalDate.now()
$46 ==> 2018-07-07

jshell> LocalDate.of(2018, 3, 30)
$47 ==> 2018-03-30

jshell> LocalTime.now()
$48 ==> 00:32:06.883656

jshell> LocalTime.of(12,43,12,33333);
$49 ==> 12:43:12.000033333

jshell> LocalDateTime.now()
$50 ==> 2018-07-07T00:32:30.335562400

jshell> LocalDateTime.of(2018, 12, 30, 12,33)
$51 ==> 2018-12-30T12:33

jshell> LocalDateTime.of(LocalDate.now(), LocalTime.now())
$52 ==> 2018-07-07T00:40:38.198318200

处理日期和时间

让我们看一下如何操作或修改创建的日期和时间实例:

jshell> LocalDate d = LocalDate.now()
d ==> 2018-07-07

jshell> d.plusDays(12)
$54 ==> 2018-07-19

jshell> d
d ==> 2018-07-07

jshell> d.plusMonths(2)
$56 ==> 2018-09-07

jshell> d.minusDays(5)
$57 ==> 2018-07-02

jshell> d.minusWeeks(4)
$58 ==> 2018-06-09

这些plus*()minus*()方法是不可变的,并返回一个新的日期和时间实例。 在上面的示例中,我们看到了几种方法来操纵java.time.LocalDate的组件。 在类似的行上,有plus*()minus*()方法用于处理java.time.LocalTimejava.time.LocalDateTime的组件。

比较日期和时间实例

我们想知道给定的日期和时间是在另一个日期之前还是之后,在这种情况下,我们将使用isBefore()isAfter()方法,如下所示:

jshell> var d1 = LocalDate.of(2018, 7, 6)
d1 ==> 2018-07-06

jshell> var d2 = LocalDate.of(2018, 7, 7)
d2 ==> 2018-07-07

jshell> d1.isAfter(d2)
$64 ==> false

jshell> d1.isBefore(d2)
$65 ==> true

jshell> var dt1 = LocalDateTime.of(2018, 7, 7, 12, 30)
dt1 ==> 2018-07-07T12:30

jshell> var dt2 = LocalDateTime.of(2018, 7, 7, 14, 30)
dt2 ==> 2018-07-07T14:30

jshell> dt1.isBefore(dt2)
$68 ==> true

jshell> dt1.isAfter(dt2)
$69 ==> false

在字符串和日期对象表示之间转换

通常,我们需要将日期和时间的String表示形式转换为其相应的对象,并且还将该对象转换为String表示形式。 对于较旧的日期类java.util.Date我们使用java.text.SimpleDateFormat解析字符串为日期,反之亦然。 在新的日期时间API中,为同一任务引入了新类java.time.format.DateTimeFormatter

如果遵循在字符串和对象表示形式之间转换日期的ISO标准,由于java.time.format.DateTimeFormatter提供了预定义的ISO格式,因此图层和应用程序之间的许多集成将变得无缝。 让我们看一下实际情况:

jshell> import java.time.*

jshell> LocalDateTime ldt = LocalDateTime.now()
ldt ==> 2018-09-26T22:58:32.229096300

jshell> import java.time.format.*

jshell> ldt.format(DateTimeFormatter.ISO_DATE)
$4 ==> "2018-09-26"

jshell> ldt.format(DateTimeFormatter.ISO_DATE_TIME)
$5 ==> "2018-09-26T22:58:32.2290963"

jshell> ldt.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
$9 ==> "2018-09-26T22:58:32.2290963"

jshell> ldt.format(DateTimeFormatter.BASIC_ISO_DATE)
$10 ==> "20180926"

我们甚至可以使用自定义格式设置模式,如下所示:

jshell> ldt.format(DateTimeFormatter.ofPattern("d-M-y"));
$11 ==> "26-9-2018"

jshell> ldt.format(DateTimeFormatter.ofPattern("d-MM-y hh:mm:ss"));
$12 ==> "26-09-2018 10:58:32"

jshell> ldt.format(DateTimeFormatter.ofPattern("d/MMM/y hh:mm:ss"));
$13 ==> "26/Sep/2018 10:58:32"

jshell> ldt.format(DateTimeFormatter.ofPattern("d-MMM-y hh:mm:ss"));
$14 ==> "26-Sep-2018 10:58:32"

jshell> ldt.format(DateTimeFormatter.ofPattern("d-MMM-y hh:mm:ss"));
$15 ==> "26-Sep-2018 10:58:32"

jshell> ldt.format(DateTimeFormatter.ofPattern("d-MMM-y HH:mm:ss"));
$16 ==> "26-Sep-2018 22:58:32"

可以在Javadoc中的java.time.format.DateTimeFormatter找到用于创建模式的不同规则。

让我们看一下将日期和时间的有效String表示形式转换为LocalDateTime及其相关对象:

<br />jshell> LocalDate ld = LocalDate.parse("2018-09-26")
ld ==> 2018-09-26

jshell> LocalDateTime ldt = LocalDateTime.parse("2018-09-26T22:24:33")
ldt ==> 2018-09-26T22:24:33

您可以看到,在上面的代码中,我们没有提供用于解析字符串的模式,而是使用了默认的ISO格式。 通过API交换日期和时间值时,此方法非常有用。

这样,我展示了一些基本的操作,您可以使用与时区无关的新日期和时间实例进行操作。 在接下来的文章中,我将写有关时区的时间,查找持续时间,时间和日期之间的时间段以及如何使用不同的日历系统。

翻译自: https://www.javacodegeeks.com/2018/10/localdate-localtime-localdatetime.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值