Java8 시간 API 사용 방법
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











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

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

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

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

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

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

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