English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 기본 튜토리얼

Java 프로세스 제어

Java 배열

Java 대상 지향적(I)

Java 대상 지향적(II)

Java 대상 지향적(III)

Java 예외 처리

Java 목록(List)

Java Queue(큐)

Java Map集合

Java Set集合

Java 입력 출력(I/O)

Java Reader/Writer

Java 다른 주제

Java 8 날짜 시간 API

Java 8 새 기능

Java 8새로운 Date-Time API (JSR 310)을 통해 날짜와 시간의 처리를 강화합니다.

오래된 Java에서 날짜 시간 API는 많은 문제가 있었으며, 중요한 문제는 다음과 같습니다:

  • 비스레드 안전하지 않습니다 − java.util.Date은 비스레드 안전하지 않으며, 모든 날짜 클래스는 변경 가능하며, 이는 Java 날짜 클래스의 가장 큰 문제 중 하나입니다.

  • 설계가 매우 나쁩니다 − Java의 날짜/날짜 클래스의 정의가 일관되지 않으며, java.util과 java.sql 패키지 모두에서 날짜 클래스가 있습니다. 또한, 형식화 및 파싱을 위한 클래스는 java.text 패키지에서 정의되었습니다. java.util.Date은 날짜와 시간을 모두 포함하고 있으며, java.sql.Date는 단지 날짜만 포함하고 있어 java.sql 패키지에 포함되는 것은 불합리합니다. 또한, 이 두 클래스는 같은 이름을 가지고 있으며, 이는 매우 나쁜 설계입니다.

  • 시간대 처리가 복잡합니다 − 날짜 클래스는 국제화를 제공하지 않으며 시간대 지원이 없기 때문에 Java는 java.util.Calendar와 java.util.TimeZone 클래스를 도입했습니다. 그러나 이들은 위의 모든 문제를 가지고 있습니다.

Java 8 에서 java.time 패키지는 많은 새로운 API를 제공합니다. 다음은 두 가지 중요한 API입니다:

  • Local(로컬) − 날짜 시간 처리를 간소화하고 시간대 문제가 없습니다.

  • Zoned(시간대) − 지정된 시간대를 통해 날짜 시간을 처리합니다.

새로운 java.time 패키지는 날짜, 시간, 날짜 처리를 모두 포함하고 있습니다./시간, 시간대, 일시(instants), 과정(during) 및 시계(clock)의 연산.

로컬라이제이션된 날짜 시간 API

LocalDate/LocalTime 과 LocalDateTime 클래스는 시간대가 필수가 아닌 경우 처리할 수 있습니다. 코드는 다음과 같습니다:

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;
import java.time.Month;
 
public class Java8Tester {
   public static void main(String args[]){
      Java8Tester java8tester = new Java8Tester();
      java8tester.testLocalDateTime();
   }
    
   public void testLocalDateTime(){
    
      // 현재 날짜와 시간을 가져오기
      LocalDateTime currentTime = LocalDateTime.now();
      System.out.println("현재 시간: " + currentTime);
        
      LocalDate date1 = currentTime.toLocalDate();
      System.out.println("date1: " + date1);
        
      Month month = currentTime.getMonth();
      int day = currentTime.getDayOfMonth();
      int seconds = currentTime.getSecond();
        
      System.out.println("월: " + 월 +", 일: " + 일 +", 초: " + seconds);
        
      LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012);
      System.out.println("date2: " + date2);
        
      // 12 december 2014
      LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12);
      System.out.println("date3: " + date3);
        
      // 22 시간 15 분
      LocalTime date4 = LocalTime.of(22, 15);
      System.out.println("date4: " + date4);
        
      // 문자열 해석
      LocalTime date5 = LocalTime.parse("20:15:30");
      System.out.println("date5: " + date5);
   }
}

위의 스크립트 실행 후, 출력 결과는 다음과 같습니다:

$ javac Java8Tester.java 
$ java Java8Tester
현재 시간: 2016-04-15T16:55:48.668
date1: 2016-04-15
월: APRIL, 일: 15, 초: 48
date2: 2012-04-10T16:55:48.668
date3: 2014-12-12
date4: 22:15
date5: 20:15:30

使用时区的日期时间API

如果我们需要考虑到时区,就可以使用时区的日期时间API:

import java.time.ZonedDateTime;
import java.time.ZoneId;
 
public class Java8Tester {
   public static void main(String args[]){
      Java8Tester java8tester = new Java8Tester();
      java8tester.testZonedDateTime();
   }
    
   public void testZonedDateTime(){
    
      // 현재 시간 날짜 가져오기
      ZonedDateTime date1 = ZonedDateTime.parse("2015-12-03T10:15:30+05:30[Asia/Shanghai]");
      System.out.println("date1: " + date1);
        
      ZoneId id = ZoneId.of("Europe/Paris");
      System.out.println("ZoneId: " + ""); + );
        
      ZoneId currentZone = ZoneId.systemDefault();
      System.out.println("현재 시간대: " + ""); + currentZone);
   }
}

위의 스크립트 실행 후, 출력 결과는 다음과 같습니다:

$ javac Java8Tester.java 
$ java Java8Tester
date1: 2015-12-03T10:15:30+08:00[Asia/Shanghai]
ZoneId: Europe/Paris
현재 시간대: Asia/Shanghai

Java 8 새 기능