목차
1. 개요
2. 이전 API의 문제(java8 이전)
3. LocalDate, LocalTime 및 LocalDateTime 사용
3.1. LocalDate 사용
3.2. LocalTime
3.3. LocalDateTime 사용
4.使用ZonedDateTime API
5.使用Period和Duration
5.1.使用Period
5.2.使用Duration
6.与日期和日历的兼容性
7. 日期和时间格式化
8.替代方案
8.1.使用Threeten 类库
8.2.Joda-Time类库
Java java지도 시간 Java8 시간 API 사용 방법

Java8 시간 API 사용 방법

Apr 28, 2023 pm 12:25 PM
java api time

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

자바의 완전수 자바의 완전수 Aug 30, 2024 pm 04:28 PM

Java의 완전수 가이드. 여기서는 정의, Java에서 완전 숫자를 확인하는 방법, 코드 구현 예제에 대해 논의합니다.

자바의 웨카 자바의 웨카 Aug 30, 2024 pm 04:28 PM

Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 스미스 번호 Java의 스미스 번호 Aug 30, 2024 pm 04:28 PM

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

Java Spring 인터뷰 질문 Java Spring 인터뷰 질문 Aug 30, 2024 pm 04:29 PM

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8 Stream foreach에서 나누거나 돌아 오시겠습니까? Java 8 Stream foreach에서 나누거나 돌아 오시겠습니까? Feb 07, 2025 pm 12:09 PM

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 날짜까지의 타임스탬프 Java의 날짜까지의 타임스탬프 Aug 30, 2024 pm 04:28 PM

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

미래를 창조하세요: 완전 초보자를 위한 Java 프로그래밍 미래를 창조하세요: 완전 초보자를 위한 Java 프로그래밍 Oct 13, 2024 pm 01:32 PM

Java는 초보자와 숙련된 개발자 모두가 배울 수 있는 인기 있는 프로그래밍 언어입니다. 이 튜토리얼은 기본 개념부터 시작하여 고급 주제를 통해 진행됩니다. Java Development Kit를 설치한 후 간단한 "Hello, World!" 프로그램을 작성하여 프로그래밍을 연습할 수 있습니다. 코드를 이해한 후 명령 프롬프트를 사용하여 프로그램을 컴파일하고 실행하면 "Hello, World!"가 콘솔에 출력됩니다. Java를 배우면 프로그래밍 여정이 시작되고, 숙달이 깊어짐에 따라 더 복잡한 애플리케이션을 만들 수 있습니다.

캡슐의 양을 찾기위한 Java 프로그램 캡슐의 양을 찾기위한 Java 프로그램 Feb 07, 2025 am 11:37 AM

캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4

See all articles