Java 8 - 새로운 날짜-시간 API

안녕하세요, 미래의 자바 마법사 여러분! ? 오늘 우리는 자바의 Date-Time API라는 마법의 세계로 함께 여행을 떠납니다. 코드를 한 줄도 적어보지 않았다면 걱정하지 마세요 - 우리는 가장 기초적인 것부터 시작하여 함께 올라갈 것입니다. 이 수업이 끝나면, 당신은 프로처럼 날짜와 시간을 다루게 될 것입니다! 그럼 시작해 볼까요?

Java - Datetime Api

자바 날짜-시간 API 소개

상상해보세요, 시간机器를 만드는 것(쿨하지 않나요?). 그것을 작동시키기 위해서는 날짜와 시간을 정밀하게 다루어야 합니다. 자바의 Date-Time API는 우리의 프로그램에서 이러한 일을 도와줍니다. 마치 정밀한 시계와 캘린더가 하나로 뭉쳐진 것처럼!

왜 새로운 API인가요?

자세한 내용에 들어가기 전에, 당신은也许 "왜 자바가 새로운 Date-Time API를 만들었나요?"라는 의문이 들었을 것입니다. 그럼 작은 이야기를 들려드리겠습니다.

옛날 옛적(자바 8 이전), 개발자들은 오래된 java.util.Datejava.util.Calendar 클래스를 사용해야 했습니다. 이 것들은 마치 오래된,绣迹斑斑한 시계처럼 - 작동은 했지만 많은 문제가 있었습니다. 사용하기 어려웠고, 스레드 안전하지 않았으며( 복잡한 프로그램에서 문제를 일으킬 수 있습니다), 시간대를 잘 처리하지 못했습니다.

그래서 자바 팀은 이러한 모든 문제를 해결할 수 있는 새로운, 반짝이는 API를 만들기로 결정했습니다. 그래서 자바 8에서 java.time 패키지가 탄생하게 되었습니다!

자바 로컬 날짜-시간 API

그럼 기초적인 것부터 시작해보겠습니다. Local Date-Time API는 시간대에 대해 신경쓰지 않고 날짜와 시간을 다루는 데 도움을 줍니다. 마치 데스크에 있는 간단한 시계와 캘린더처럼.

LocalDate

LocalDate는 시간대 없는 날짜를 나타냅니다. 그럼 어떻게 사용하는지 보겠습니다:

import java.time.LocalDate;

public class DateExample {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
System.out.println("오늘의 날짜는: " + today);

LocalDate specificDate = LocalDate.of(2023, 6, 15);
System.out.println("특정 날짜: " + specificDate);
}
}

이 예제에서 우리는 두 가지 일을 합니다:

  1. LocalDate.now()를 사용하여 오늘의 날짜를 가져옵니다.
  2. LocalDate.of()를 사용하여 특정 날짜(2023년 6월 15일)를 생성합니다.

이 코드를 실행하면 오늘의 날짜와 생성한 특정 날짜가 출력됩니다.

LocalTime

LocalTime은 날짜나 시간대 없는 시간을 나타냅니다. 그럼 어떻게 사용하는지 보겠습니다:

import java.time.LocalTime;

public class TimeExample {
public static void main(String[] args) {
LocalTime now = LocalTime.now();
System.out.println("현재 시간은: " + now);

LocalTime specificTime = LocalTime.of(14, 30, 45);
System.out.println("특정 시간: " + specificTime);
}
}

이 예제에서 우리는 두 가지 일을 합니다:

  1. LocalTime.now()를 사용하여 현재 시간을 가져옵니다.
  2. LocalTime.of()를 사용하여 특정 시간(오후 2시 30분 45초)을 생성합니다.

LocalDateTime

LocalDateTime은 날짜와 시간을 포함하지만 시간대는 포함하지 않습니다. 마치 시간과 날짜를 모두 보여주는 시계처럼. 그럼 어떻게 사용하는지 보겠습니다:

import java.time.LocalDateTime;

public class DateTimeExample {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
System.out.println("현재 날짜와 시간: " + now);

LocalDateTime specificDateTime = LocalDateTime.of(2023, 6, 15, 14, 30, 45);
System.out.println("특정 날짜와 시간: " + specificDateTime);
}
}

이 예제에서 우리는 두 가지 일을 합니다:

  1. LocalDateTime.now()를 사용하여 현재 날짜와 시간을 가져옵니다.
  2. LocalDateTime.of()를 사용하여 특정 날짜와 시간(2023년 6월 15일 오후 2시 30분 45초)을 생성합니다.

자바 시간대 날짜-시간 API

이제 우리의 시간机器에 좀 더 맛을 더해보겠습니다 - 시간대! Zoned Date-Time API는 다른 시간대를 고려하여 날짜와 시간을 다루는 데 도움을 줍니다.

ZonedDateTime

ZonedDateTime는 시간대를 포함한 날짜-시간을 나타냅니다. 마치 세계 각지의 시간을 보여주는 세계 시계처럼.

import java.time.ZonedDateTime;
import java.time.ZoneId;

public class ZonedDateTimeExample {
public static void main(String[] args) {
ZonedDateTime nowInSystemTZ = ZonedDateTime.now();
System.out.println("시스템 시간대의 현재 날짜-시간: " + nowInSystemTZ);

ZonedDateTime nowInParis = ZonedDateTime.now(ZoneId.of("Europe/Paris"));
System.out.println("파리의 현재 날짜-시간: " + nowInParis);
}
}

이 예제에서 우리는 두 가지 일을 합니다:

  1. 시스템의 기본 시간대에서 현재 날짜-시간을 가져옵니다.
  2. 파리 시간대에서 현재 날짜-시간을 가져옵니다.

자바 크로노 유닛 Enum

ChronoUnit enum은 표준 날짜 기간과 시간 단위를 제공합니다. 시간을 측정하는 다양한 도구처럼 - 초, 분, 시간, 일, 주, 월, 연 등이 있습니다.

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

public class ChronoUnitExample {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
LocalDateTime futureDateTime = now.plus(1, ChronoUnit.WEEKS);

long daysBetween = ChronoUnit.DAYS.between(now, futureDateTime);
System.out.println("현재와 일주일 후의 차이 일수: " + daysBetween);
}
}

이 예제에서 우리는 두 가지 일을 합니다:

  1. 현재 날짜-시간에 일주일을 더합니다.
  2. 현재 날짜-시간과 일주일 후의 차이 일수를 계산합니다.

자바 Period와 Duration

PeriodDuration은 시간의 양을 나타냅니다. Period는 캘린더에서 두 날짜의 차이를 나타내고, Duration은 스톱워치에 보여지는 시간을 나타냅니다.

import java.time.LocalDate;
import java.time.Period;
import java.time.Duration;
import java.time.LocalTime;

public class PeriodDurationExample {
public static void main(String[] args) {
LocalDate date1 = LocalDate.of(2023, 1, 1);
LocalDate date2 = LocalDate.of(2023, 12, 31);
Period period = Period.between(date1, date2);
System.out.println("두 날짜 간의 기간: " + period);

LocalTime time1 = LocalTime.of(9, 0);
LocalTime time2 = LocalTime.of(17, 30);
Duration duration = Duration.between(time1, time2);
System.out.println("두 시간 간의 지속 시간: " + duration);
}
}

이 예제에서 우리는 두 가지 일을 합니다:

  1. 두 날짜 간의 기간을 계산합니다.
  2. 두 시간 간의 지속 시간을 계산합니다.

자바 시간 조정자

시간 조정자는 날짜를 유용한 방법으로 조정하는 마법의 지팡이입니다. 다음 월요일이나 월의 마지막 날을 찾는 등의 작업을 수행할 수 있습니다.

import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;

public class TemporalAdjustersExample {
public static void main(String[] args) {
LocalDate date = LocalDate.now();
LocalDate nextMonday = date.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
System.out.println("다음 월요일: " + nextMonday);

LocalDate lastDayOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());
System.out.println("이 달의 마지막 날: " + lastDayOfMonth);
}
}

이 예제에서 우리는 두 가지 일을 합니다:

  1. 다음 월요일을 찾습니다.
  2. 이 달의 마지막 날을 찾습니다.

이전 호환성

이제 perhaps 당신은 "오래된 코드는 어떻게 되나요?"라는 의문이 들었을 것입니다. 걱정하지 마세요! 자바는 이전의 날짜와 시간 클래스와의 호환성을 제공하는 방법을 생각해 둡니다. 새로운 API는 이전의 날짜와 시간 클래스 간의 변환을 지원합니다.

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

public class BackwardCompatibilityExample {
public static void main(String[] args) {
// 오래된 Date를 새로운 LocalDateTime으로 변환
Date oldDate = new Date();
LocalDateTime newDateTime = LocalDateTime.ofInstant(oldDate.toInstant(), ZoneId.systemDefault());
System.out.println("오래된 Date: " + oldDate);
System.out.println("새로운 LocalDateTime: " + newDateTime);

// 새로운 LocalDateTime을 오래된 Date로 변환
LocalDateTime localDateTime = LocalDateTime.now();
Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
System.out.println("새로운 LocalDateTime: " + localDateTime);
System.out.println("오래된 Date: " + date);
}
}

이 예제에서 우리는 두 가지 일을 합니다:

  1. 오래된 Date 객체를 새로운 LocalDateTime 객체로 변환합니다.
  2. 새로운 LocalDateTime 객체를 오래된 Date 객체로 변환합니다.

이러한 이전 호환성은 당신이 오래된 자바 코드와 함께 작업하면서 새로운 Date-Time API의 혜택을 누릴 수 있도록 합니다.

결론

축하합니다! 자바의 Date-Time API 세계로 첫 걸음을 뗐습니다. 우리는 많은 내용을 다루었고, 날짜와 시간의 기본적인 처리에서 시간대와 시간 조정자에 이르기까지 다양한 개념을 배웠습니다.

기억하시길, 날짜와 시간의 마스터링은 연습이 필요합니다. 초보자라면 혼란스러울 수 있지만, 경험 많은 개발자들도 이 클래스들을 자주 찾아보는 경우가 있습니다!

이 예제들을 실험하고, 수정해 보고, 어떤 일이 일어나는지 확인해 보세요. 얼마 지나지 않아, 당신은 진정한 자바 시간 여행자가 될 것입니다!

행복한 코딩을 기원하며, 시간이 항상 정확하게 맞춰지길 바랍니다! ⏰?

Credits: Image by storyset