이 기사의 일부로 기존 날짜 및 달력 API의 몇 가지 문제부터 시작하여 새로운 Java 8 날짜 및 시간 API가 이러한 문제를 해결하는 방법을 살펴보겠습니다.
LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Period, Duration 및 해당 API와 같은 Java 8 시간 클래스 라이브러리의 핵심 클래스도 살펴보겠습니다.
스레드 안전성 - 날짜 및 달력 클래스는 스레드로부터 안전하지 않으므로 개발자가 이러한 API의 동시성 문제를 디버그하기 어렵고 추가 코드를 작성해야 합니다. 스레드 안전을 처리합니다. Java 8에 도입된 새로운 날짜 및 시간 API는 변경이 불가능하고 스레드로부터 안전하므로 이러한 문제점을 해결할 수 있습니다.
API 디자인 및 이해하기 쉬움 - 이전 API는 이해하기가 매우 어렵고 작업이 매우 복잡하고 복잡하며 일반적인 구문 분석 및 변환 방법을 제공하지 않습니다. 새로운 시간 API는 ISO 중심이며 날짜, 시간, 기간 및 기간에 대해 일관된 도메인 모델을 따릅니다. 가장 일반적인 작업을 지원하기 위해 몇 가지 매우 유용한 방법이 제공됩니다. 더 이상 일부 시간 작업 클래스를 직접 캡슐화할 필요가 없습니다.
ZonedDate 및 시간 - 예전에는 API 개발자가 기존 API의 시간대 로직을 처리하기 위해 추가 로직을 작성해야 했지만, 새 API에서는 Local 및 ZonedDate/Time API를 사용하여 시간대를 처리할 수 있습니다. 시간대 변환에 대해 너무 걱정할 필요가 없습니다.
가장 일반적으로 사용되는 클래스는 LocalDate, LocalTime 및 LocalDateTime입니다. 이름에서 알 수 있듯이 컨텍스트와 결합된 현지 날짜/시간을 나타냅니다.
이러한 클래스는 컨텍스트에서 시간대를 명시적으로 지정할 필요가 없을 때 주로 사용됩니다. 이 섹션에서는 가장 일반적으로 사용되는 API를 다룹니다.
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());
이제 현지 시간을 어떻게 사용하는지 살펴보겠습니다.
을 사용하여 날짜 없이 시간을 현지 시간으로 표현합니다.
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에 대해 자세히 살펴보겠습니다.
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();
当我们需要处理时区特定的日期和时间时,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类修改日期和时间值。
Period : 用于计算两个日期(年月日)间隔。
Duration : 用于计算两个时间(秒,纳秒)间隔。
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类。
类似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。
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);
现在让我们继续进行日期和时间格式化。
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 可用的替代方案。
对于从Java 7或Java 6这些老项目来说可以使用Threeten ,然后可以像在上面java 8一样使用相同的功能,一旦你迁移到java 8 只需要修改你的包路径代码而无需变更:
<dependency> <groupId>org.threeten</groupId> <artifactId>threetenbp</artifactId> <version>LATEST</version> </dependency>
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!