Java 8对日期和时间API进行了重大更改,这是在JSR 310:日期和时间API的 JDK中包括了Joda Time API 。 此JSR由Joda Time的创建者Stephen Colebourne领导。
有许多惊人的API可用于日期和时间。 在本文中,我将介绍最常用的: java.time.LocalDate
, java.time.LocalTime
和java.time.LocalDateTime
。 这些代表独立于时区的日期和时间值。 因此,它们依靠系统时钟来捕获值。
创建一个实例
让我们来看看使用创建它们的实例的方式now()
方法和工厂方法of()
jshell> LocalDate.now()
$46 ==> 2018-07-07jshell> LocalDate.of(2018, 3, 30)
$47 ==> 2018-03-30jshell> LocalTime.now()
$48 ==> 00:32:06.883656jshell> LocalTime.of(12,43,12,33333);
$49 ==> 12:43:12.000033333jshell> LocalDateTime.now()
$50 ==> 2018-07-07T00:32:30.335562400jshell> LocalDateTime.of(2018, 12, 30, 12,33)
$51 ==> 2018-12-30T12:33jshell> LocalDateTime.of(LocalDate.now(), LocalTime.now())
$52 ==> 2018-07-07T00:40:38.198318200
处理日期和时间
让我们看一下如何操作或修改创建的日期和时间实例:
jshell> LocalDate d = LocalDate.now()
d ==> 2018-07-07jshell> d.plusDays(12)
$54 ==> 2018-07-19jshell> d
d ==> 2018-07-07jshell> d.plusMonths(2)
$56 ==> 2018-09-07jshell> d.minusDays(5)
$57 ==> 2018-07-02jshell> d.minusWeeks(4)
$58 ==> 2018-06-09
这些plus*()
和minus*()
方法是不可变的,并返回一个新的日期和时间实例。 在上面的示例中,我们看到了几种方法来操纵java.time.LocalDate
的组件。 在类似的行上,有plus*()
和minus*()
方法用于处理java.time.LocalTime
和java.time.LocalDateTime
的组件。
比较日期和时间实例
我们想知道给定的日期和时间是在另一个日期之前还是之后,在这种情况下,我们将使用isBefore()
和isAfter()
方法,如下所示:
jshell> var d1 = LocalDate.of(2018, 7, 6)
d1 ==> 2018-07-06jshell> var d2 = LocalDate.of(2018, 7, 7)
d2 ==> 2018-07-07jshell> d1.isAfter(d2)
$64 ==> falsejshell> d1.isBefore(d2)
$65 ==> truejshell> var dt1 = LocalDateTime.of(2018, 7, 7, 12, 30)
dt1 ==> 2018-07-07T12:30jshell> var dt2 = LocalDateTime.of(2018, 7, 7, 14, 30)
dt2 ==> 2018-07-07T14:30jshell> dt1.isBefore(dt2)
$68 ==> truejshell> 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.229096300jshell> 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-26jshell> 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