> Java > java지도 시간 > 본문

Java8 시간 API 사용 방법

WBOY
풀어 주다: 2023-04-28 12:25:13
앞으로
1189명이 탐색했습니다.

1. 개요

이 기사의 일부로 기존 날짜 및 달력 API의 몇 가지 문제부터 시작하여 새로운 Java 8 날짜 및 시간 API가 이러한 문제를 해결하는 방법을 살펴보겠습니다.

LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Period, Duration 및 해당 API와 같은 Java 8 시간 클래스 라이브러리의 핵심 클래스도 살펴보겠습니다.

2. 이전 API의 문제(java8 이전)

  • 스레드 안전성 - 날짜 및 달력 클래스는 스레드로부터 안전하지 않으므로 개발자가 이러한 API의 동시성 문제를 디버그하기 어렵고 추가 코드를 작성해야 합니다. 스레드 안전을 처리합니다. Java 8에 도입된 새로운 날짜 및 시간 API는 변경이 불가능하고 스레드로부터 안전하므로 이러한 문제점을 해결할 수 있습니다.

  • API 디자인 및 이해하기 쉬움 - 이전 API는 이해하기가 매우 어렵고 작업이 매우 복잡하고 복잡하며 일반적인 구문 분석 및 변환 방법을 제공하지 않습니다. 새로운 시간 API는 ISO 중심이며 날짜, 시간, 기간 및 기간에 대해 일관된 도메인 모델을 따릅니다. 가장 일반적인 작업을 지원하기 위해 몇 가지 매우 유용한 방법이 제공됩니다. 더 이상 일부 시간 작업 클래스를 직접 캡슐화할 필요가 없습니다.

  • ZonedDate 및 시간 - 예전에는 API 개발자가 기존 API의 시간대 로직을 처리하기 위해 추가 로직을 작성해야 했지만, 새 API에서는 Local 및 ZonedDate/Time API를 사용하여 시간대를 처리할 수 있습니다. 시간대 변환에 ​​대해 너무 걱정할 필요가 없습니다.

3. LocalDate, LocalTime 및 LocalDateTime 사용

가장 일반적으로 사용되는 클래스는 LocalDate, LocalTime 및 LocalDateTime입니다. 이름에서 알 수 있듯이 컨텍스트와 결합된 현지 날짜/시간을 나타냅니다.

이러한 클래스는 컨텍스트에서 시간대를 명시적으로 지정할 필요가 없을 때 주로 사용됩니다. 이 섹션에서는 가장 일반적으로 사용되는 API를 다룹니다.

3.1. LocalDate 사용

LocalDate는 ISO 형식(YYYY-MM-DD)으로 특정 시간이 없는 날짜를 나타냅니다.

우리가 가장 중요하게 생각하는 생일이나 급여일을 표현할 때 자주 사용됩니다.

다음과 같이 현재 시스템 시계에서 날짜를 가져옵니다.

LocalDate localDate = LocalDate.now();
로그인 후 복사

특정 일, 월, 연도를 나타내는 LocalDate는 "of" 메서드나 "parse" 메서드를 사용하여 가져올 수 있습니다. 예를 들어, 다음 코드 조각은 2015년 2월 20일의 LocalDate를 나타냅니다.

LocalDate.of(2015, 02, 20);
LocalDate.parse("2015-02-20");
로그인 후 복사

매우 직관적이고 편리하지 않나요! LocalDate는 다양한 날짜 정보를 얻기 위한 다양한 유틸리티 방법을 제공합니다. 이러한 API 메소드를 간단히 살펴보겠습니다.

다음 코드 조각은 현재 현지 날짜를 가져오고 하루를 더합니다.

LocalDate tomorrow = LocalDate.now().plusDays(1);
로그인 후 복사

이 예는 현재 날짜를 가져오고 한 달을 뺍니다. 열거형을 시간 단위로 받아들이는 방법에 유의하세요.

LocalDate previousMonthSameDay = LocalDate.now().minus(1, ChronoUnit.MONTHS);
로그인 후 복사

다음 두 코드 예제에서는 "2016-06-12" 날짜를 구문 분석하고 각각 요일과 날짜를 가져옵니다. 반환 값에 주의하세요. 첫 번째는 DayOfWeek를 나타내는 개체이고 두 번째는 해당 월의 서수 값을 나타내는 int입니다.

DayOfWeek sunday = LocalDate.parse("2016-06-12").getDayOfWeek();
int twelve = LocalDate.parse("2016-06-12").getDayOfMonth();
로그인 후 복사

다음을 사용하면 날짜가 윤년에 발생하는지 테스트할 수 있습니다. 오래된 방법으로는 천국에 가지 못할 수도 있습니다:

boolean leapYear = LocalDate.now().isLeapYear();
로그인 후 복사

날짜 순서를 판단하세요:

boolean notBefore = LocalDate.parse("2016-06-12").isBefore(LocalDate.parse("2016-06-11"));
boolean isAfter = LocalDate.parse("2016-06-12").isAfter(LocalDate.parse("2016-06-11"));
로그인 후 복사

날짜 경계는 주어진 날짜에서 얻을 수 있습니다. 다음 두 예제에서는 특정 날짜(2016-06-12T00:00)의 하루 시작을 나타내는 LocalDateTime과 월 시작(2016-06-01)을 나타내는 LocalDate를 얻습니다.

LocalDateTime beginningOfDay = LocalDate.parse("2016-06-12").atStartOfDay();
LocalDate firstDayOfMonth = LocalDate.parse("2016-06-12")
.with(TemporalAdjusters.firstDayOfMonth());
로그인 후 복사

이제 현지 시간을 어떻게 사용하는지 살펴보겠습니다.

3.2. LocalTime

을 사용하여 날짜 없이 시간을 현지 시간으로 표현합니다.

LocalDate와 마찬가지로 LocalTime 인스턴스는 시스템 시계에서 생성하거나 "parse" 및 "of" 메서드를 사용하여 생성할 수 있습니다. 아래에서 일반적으로 사용되는 API를 간단히 살펴보세요.

다음과 같이 시스템 시계에서 현재 LocalTime의 인스턴스를 생성할 수 있습니다.

LocalTime now = LocalTime.now();
로그인 후 복사

다음 코드 예제에서는 문자열 표현을 구문 분석하여 오전 6시 30분을 나타내는 LocalTime을 생성합니다.

LocalTime sixThirty = LocalTime.parse("06:30");
로그인 후 복사

Method "of " LocalTime을 생성하는 데 사용할 수 있습니다. 예를 들어, 아래 코드는 "of" 메서드를 사용하여 오전 6시 30분을 나타내는 LocalTime을 생성합니다.

LocalTime sixThirty = LocalTime.of(6, 30);
로그인 후 복사

아래 예제에서는 문자열을 구문 분석하여 LocalTime을 생성하고 "plus" API를 사용하여 여기에 시간을 추가합니다. 결과는 오전 7시 30분을 나타내는 LocalTime입니다.

LocalTime sevenThirty = LocalTime.parse("06:30").plus(1, ChronoUnit.HOURS);
로그인 후 복사

다양한 getter 메소드를 사용하여 시, 분, 초와 같은 특정 시간 단위를 얻을 수 있습니다. 시간은 다음과 같이 가져옵니다.

int six = LocalTime.parse("06:30").getHour();
로그인 후 복사

LocalDate와 동일하여 특정 시간은 다른 특정 시간 이전 또는 이후입니다. 다음 코드 예제에서는 결과가 true인 두 LocalTime을 비교합니다.

boolean isbefore = LocalTime.parse("06:30").isBefore(LocalTime.parse("07:30"));
로그인 후 복사

하루 중 최대, 최소 및 정오 시간은 LocalTime 클래스의 상수를 통해 얻을 수 있습니다. 이는 주어진 시간 범위 내에서 레코드를 찾기 위해 데이터베이스 쿼리를 수행할 때 유용합니다. 예를 들어 아래 코드는 23:59:59.99를 나타냅니다.

LocalTime maxTime = LocalTime.MAX
로그인 후 복사

이제 LocalDateTime에 대해 자세히 살펴보겠습니다.

3.3. LocalDateTime 사용

LocalDateTime은 날짜와 시간의 조합을 나타내는 데 사용됩니다.

날짜와 시간을 결합해야 할 때 가장 일반적으로 사용되는 클래스입니다. 본 클래스에서는 다양한 API를 제공하는데, 가장 일반적으로 사용되는 API를 소개하겠습니다.

LocalDate 및 LocalTime과 유사 시스템 시계에서 LocalDateTime 인스턴스 가져오기:

LocalDateTime.now();
로그인 후 복사

下面的代码示例解释了如何使用工厂“of”和“parse”方法创建实例。结果将是代表2015年2月20日06:30 AM 的LocalDateTime实例:

LocalDateTime.of(2015, Month.FEBRUARY, 20, 06, 30);
LocalDateTime.parse("2015-02-20T06:30:00");
로그인 후 복사

有一些实用的API可以支持特定时间单位的时间运算,例如天,月,年和分钟。以下代码示例演示了“加”和“减”方法的用法。这些API的行为与LocalDate和LocalTime中的 API完全相同:

localDateTime.plusDays(1);
localDateTime.minusHours(2);
로그인 후 복사

Getter方法可用于提取类似于日期和时间类的特定单位。鉴于上面的LocalDateTime实例,下面的代码示例将返回2月份的月份:

localDateTime.getMonth();
로그인 후 복사

4.使用ZonedDateTime API

当我们需要处理时区特定的日期和时间时,Java 8提供了ZonedDateTime 类。ZoneID是用于表示不同区域的标识符。大约有40个不同的时区,使用ZoneID表示它们,如下所示

下面的代码我们来获取下“亚洲/上海”时区:

ZoneId zoneId = ZoneId.of("Aisa/Shanghai");
로그인 후 복사

获取所有的时区:

Set<String> allZoneIds = ZoneId.getAvailableZoneIds();
로그인 후 복사

LocalDateTime转化为特定的时区中的时间:

ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, zoneId);
로그인 후 복사

ZonedDateTime提供解析方法来获取时区的特定日期时间:

ZonedDateTime.parse("2015-05-03T10:15:30+01:00[Aisa/Shanghai]");
로그인 후 복사

使用时区的另一种方法是使用OffsetDateTime。OffsetDateTime是具有偏移量的日期时间的不可变表示形式。此类存储所有日期和时间字段,精确到纳秒,以及从UTC/格林威治的偏移量。可以使用ZoneOffset创建OffsetDateTime实例。这里我们创建一个LocalDateTime来表示2015年2月20日上午6:30:

LocalDateTime localDateTime = LocalDateTime.of(2015, Month.FEBRUARY, 20, 06, 30);
로그인 후 복사

然后我们通过创建ZoneOffset并为LocalDateTime实例设置来增加两个小时:

ZoneOffset offset = ZoneOffset.of("+02:00");
OffsetDateTime offSetByTwo = OffsetDateTime.of(localDateTime, offset);
로그인 후 복사

我们现在的本地日期时间为2015-02-20 06:30 +02:00。现在让我们继续讨论如何使用Period和Duration类修改日期和时间值。

5.使用Period和Duration

  • Period : 用于计算两个日期(年月日)间隔。

  • Duration : 用于计算两个时间(秒,纳秒)间隔。

5.1.使用Period

Period 类被广泛地用于修改给定的日期的值或者获取两个日期之间的差值:

LocalDate initialDate = LocalDate.parse("2007-05-10");
LocalDate finalDate = initialDate.plus(Period.ofDays(5));
로그인 후 복사

Period 类有各种getter方法,如getYears,getMonths和getDays从获取值周期对象。下面的代码示例返回一个int值为5,是基于上面示例的逆序操作:

int five = Period.between(finalDate, initialDate).getDays();
로그인 후 복사

该Period 可以在特定的单元获得两个日期之间的如天或月或数年,使用ChronoUnit.between:

int five = ChronoUnit.DAYS.between(finalDate , initialDate);
로그인 후 복사

此代码示例返回五天。让我们继续看看Duration类。

5.2.使用Duration

类似Period ,该Duration类是用来处理时间。在下面的代码中,我们创建一个本地时间上午6:30,然后加30秒的持续时间,以使本地时间上午6时三十〇分30秒的:

LocalTime initialTime = LocalTime.of(6, 30, 0);
LocalTime finalTime = initialTime.plus(Duration.ofSeconds(30));
로그인 후 복사

两个时刻之间的持续时间可以作为持续时间或作为特定单位获得。在第一个代码片段中,我们使用Duration类的between()方法来查找finalTime和initialTime之间的时间差,并以秒为单位返回差异:

int thirty = Duration.between(finalTime, initialTime).getSeconds();
로그인 후 복사

在第二个例子中,我们使用ChronoUnit类的between()方法来执行相同的操作:

int thirty = ChronoUnit.SECONDS.between(finalTime, initialTime);
로그인 후 복사

现在我们来看看如何将旧的Date 和Calendar 转换为新的Date和Time。

6.与日期和日历的兼容性

Java 8添加了toInstant()方法,该方法有助于将旧API中的Date和Calendar实例转换为新的Date Time API,如下面的代码片段所示:

LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
LocalDateTime.ofInstant(calendar.toInstant(), ZoneId.systemDefault());
로그인 후 복사

所述LocalDateTime可以从如下“ofEpochSecond"方法来构造。以下代码的结果将是代表2016-06-13T11:34:50 的LocalDateTime:

LocalDateTime.ofEpochSecond(1465817690, 0, ZoneOffset.UTC);
로그인 후 복사

现在让我们继续进行日期和时间格式化。

7. 日期和时间格式化

Java 8提供了用于轻松格式化日期和时间的 API :

LocalDateTime localDateTime = LocalDateTime.of(2015, Month.JANUARY, 25, 6, 30);
로그인 후 복사

以下代码传递ISO日期格式以格式化本地日期。结果将是2015-01-25:

String localDateString = localDateTime.format(DateTimeFormatter.ISO_DATE);
로그인 후 복사

该DateTimeFormatter提供多种标准格式选项。也可以提供自定义模式来格式化方法,如下所示,它将返回LocalDate为2015/01/25:

localDateTime.format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
로그인 후 복사

我们可以将格式样式传递为SHORT,LONG或MEDIUM作为格式化选项的一部分。

下面的代码示例输出2015年1月25日06:30:00 me的输:

localDateTime
.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
.withLocale(Locale.UK);
로그인 후 복사

最后让我们看看Java 8 Core Date / Time API 可用的替代方案。

8.替代方案

8.1.使用Threeten 类库

对于从Java 7或Java 6这些老项目来说可以使用Threeten ,然后可以像在上面java 8一样使用相同的功能,一旦你迁移到java 8 只需要修改你的包路径代码而无需变更:

<dependency>
<groupId>org.threeten</groupId>
<artifactId>threetenbp</artifactId>
<version>LATEST</version>
</dependency>
로그인 후 복사

8.2.Joda-Time类库

Java 8 日期和时间库的另一种替代方案是Joda-Time库。事实上,Java 8 Date Time API由Joda-Time库(Stephen Colebourne)和Oracle共同领导。该库提供了Java 8 Date Time项目中支持的几乎所有功能。通过在项目中引用以下pom依赖项就可以立即使用:

<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>LATEST</version>
</dependency>
로그인 후 복사

위 내용은 Java8 시간 API 사용 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿