본문 바로가기
JAVA/Java

[Java] 시각과 날짜의 처리

by 민트맛녹차 2022. 9. 24.

Instant 클래스

Instant now = Instant.now();
now.getEpochSecond();

Instant 클래스는 타임 라인의 특정 시점을 표현하는 클래스이다.

위의 코드 처럼 now 메서드를 사용하면 현재 시각 정보를 담은 인스턴스를 생성할 수 있다.

'1970-01-01 00:00:00' 을 표준 자바 epcoh 이라고 한다. getEpcohSecond 메서드를 사용하면 표준 자바 epoch 을 기준으로 지나온 시간을 초 단위로 계산한 결과를 반환한다.

 

Duration 클래스

Instant start = Instant.now();
...
Instant end = Instant.now();

Duration between = Duration.between(start, end);
System.out.println("밀리 초 단위 차 : " + between.toMillis());

Duration 클래스는 시각의 차를 표현하는 클래스이다. 

위의 코드처럼 between 메서드를 사용하면 두 시각의 차 정보가 담긴 인스턴스가 생성된다. toMillis() 메서드를 통해 시간 정보를 1/1000초 단위의 정밀도로 확인할 수 있다.

 

LocalDate 클래스

LocalDate today = LocalDate.now();
LocalDate childrensDay = LocalDate.of(2022, 5, 5);

LocalDate prevDay = today.minusDays(1);
LocalDate nextDay = today.plusDays(1);

LocalDate 클래스는 시각 정보가 생략된 날짜 정보를 표현하는 클래스이다. now 메서드를 통해 오늘 날짜 정보를 담은 인스턴스를 생성할 수 있고, of 메서드를 통해 매개변수로 직접 날짜 정보를 전달하여 인스턴스를 생성할 수 있다.

LocalDate 인스턴스의 정보를 변경하기 위한 여러 메서드들이 정의되어 있다. Day, Month, Year 등을 더하고 뺄 수 있다.

LocalDate 인스턴스는 immutable 인스턴스이므로 기존 정보를 수정하는 것이 아닌, 새로운 인스턴스를 생성해 반환하는 형태로 진행된다.

 

Period 클래스

LocalDate today = LocalDate.now();
LocalDate xmas = LocalDate.of(today.getYear(), 12, 25);

Period left = Period.between(today, xmax);
System.out.println("left : " + left.getMonths() + "월 " + left.getDays() + "일");

시각의 차를 표현하는 Duration 클래스처럼, 날짜의 차를 표현하는 Period 클래스가 존재한다.

위의 코드처럼 between 메서드를 사용하면 두 날짜의 차 정보가 담긴 인스턴스가 생성된다. getXXX 와 같은 메서드를 호출해 인스턴스에 저장된 년, 월, 일 정보를 얻을 수 있다.

Period 클래스에도 Day, Month, Year 를 더하고 뺄 수 있는 메서드를 제공한다.

 

LocalTime 클래스

LocalTime now = LocalTime.now();
LocalTime lunch = LocalTime.of(12, 0, 0);

lunch = lunch.plusMinutes(20);
lunch = lunch.minusMinutes(20);

LocalTime 클래스는 시각 정보를 표현하는 클래스이다. now 메서드를 통해 현재 시각 정보를 담은 인스턴스를 생성할 수 있고, of 메서드를 통해 매개변수로 직접 시각 정보를 전달하여 인스턴스를 생성할 수 있다.

LocalTime 인스턴스의 정보를 변경하기 위한 여러 메서드들이 정의되어 있다. Hour, Minute, Second 등을 더하고 뺄 수 있다. LocalTime 인스턴스는 immutable 인스턴스이므로 기존 정보를 수정하는 것이 아닌, 새로운 인스턴스를 생성해 반환하는 형태로 진행된다.

Duration 클래스를 이용하여 LocalTime 인스턴스들의 시각 차를 알 수 있다.

 

LocalDateTime 클래스

LocalDateTime today = LocalDateTime.now();	// 2022-09-24T15:45:51.148648900
LocalDateTime flight1 = LocalDateTime.of(2022, 10, 25, 11, 15);
LocalDateTime flight2 = LocalDateTime.of(2022, 10, 23, 17, 40);

if (flight1.isBefore(flight2)) { ... }
if (flight1.isAfter(flight2)) { ... }

LocalDate localDate = today.toLocalDate();	// 2022-09-24
LocalTime localTime = today.toLocalTime();	// 15:45:51.148648900

LocalDateTime 클래스는 시각 정보와 날짜 정보를 동시에 나타내는 클래스이다. now 메서드를 통해 현재 날짜와 시각 정보를 담은 인스턴스를 생성할 수 있고, of 메서드를 통해 매개변수로 직접 정보를 전달하여 인스턴스를 생성할 수 있다.

년, 월, 일, 시, 분, 초 등을 변경할 수 있는 여러 매서드들이 정의되어 있고, LocalDateTime 클래스 또한 Immutable 인스턴스이다. 

isBefore/isAfter 메서드는 LocalDateTime 인스턴스를 비교하여 날짜와 시각이 이전인지 이후인지에 대한 true/false 값을 반환한다.

toLocalDate/toLocalTime 메서드를 사용하면 LocalDateTime 인스턴스를 LocalDate/LocalTime 인스턴스로 바꿔준다.

 

ZoneId 클래스

ZoneId paris = ZoneId.of("Europe/Paris");
Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
System.out.println("availableZoneIds = " + availableZoneIds);

ZonedId 클래스는 특정 시간대 정보를 담고 있는 클래스이다. 매개변수로 받는 문자열은 지정되어 있으므로 확인하여 사용해야 한다. getAvailableZoneIds 메서드를 사용해 확인할 수 있다.

 

ZonedDateTime 클래스

ZonedDateTime seoul = ZonedDateTime.now();
// 2022-09-24T16:19:56.631797400+09:00[Asia/Seoul]
ZonedDateTime paris = ZonedDateTime.now(ZoneId.of("Europe/Paris"));
// 2022-09-24T09:19:56.633798700+02:00[Europe/Paris]

ZonedDateTime arrival = ZonedDateTime.of(
        LocalDateTime.of(2022, 12, 25, 15, 30),
        ZoneId.of("Europe/Paris"));
// 2022-12-25T15:30+01:00[Europe/Paris]

시간대 정보를 가지지 않는 LocalDateTime 클래스와 달리, ZonedDateTime 클래스는 시간대 정보를 가진 날짜와 시각 정보를 나타내는 클래스이다.

now 메서드를 통해 현재 날짜, 시각, 시간대 정보를 담은 인스턴스를 생성할 수 있고, 매개변수로 ZoneId 인스턴스를 전달하여 다른 시간대의 날짜, 시각 정보를 알 수 있다. of 메서드를 통해 매개변수로 직접 정보를 전달하여 인스턴스를 생성할 수 있다.

ZonedDateTime 인스턴스를 사용해 Duration 인스턴스를 생성한다면, 같은 날짜와 시각 정보를 가졌더라도 시간대가 함께 고려되어 시각의 차를 계산할 수 있다.

 

포맷 지정

public String format(DateTimeFormatter formatter) { ... }

ZonedDateTime now = ZonedDateTime.now();
DateTimeFormatter format = DateTimeFormatter.ofPattern("[VV] yyyy년 MM월 dd일 HH시 mm분 ss초");
System.out.println("현재 : " + now.format(format));
// 현재 : Asia/Seoul 2022년 09월 24일 16시 44분 22초

LocalDate, LocalTime, LocalDateTime, ZonedDateTime 클래스에 선언된 format 메서드를 사용하면 사용자가 원하는 포맷으로 정보를 구성하여 반환할 수 있다. format 메서드는 매개변수 형으로 DateTimeFormatter 클래스를 가진다. 

대표적으로 ofPatterm 메서드를 사용하여 DateTimeFormatter 인스턴스를 생성할 수 있다. 패턴이 존재하므로 올바른 문법을 사용해야 원하는 형태의 format 을 가진 인스턴스를 생성할 수 있다. y, M, d, H, m, s VV 는 각각 년, 월, 일, 시, 분, 초, 시간대를 의미한다.

 

 

참조
윤성우의 열혈 JAVA 프로그래밍
https://docs.oracle.com/javase/9/docs/api/index.html?overview-summary.html

'JAVA > Java' 카테고리의 다른 글

[Java] NIO 와 NIO.2  (0) 2022.10.02
[Java] I/O 스트림  (0) 2022.09.29
[Java] Stream  (1) 2022.09.23
[Java] Optional 클래스  (0) 2022.09.15
[Java] 메서드 참조(Method Reference)  (0) 2022.09.15

댓글