본문 바로가기
Programming

JAVA 날짜와 시간 처리

by 나무수피아는 지식의 가지를 뻗어가는 공간입니다. 2025. 11. 22.
반응형

📘 날짜와 시간 (Date and Time)

자바에서는 날짜와 시간을 다루기 위해 Date, Calendar, 그리고 자바 8부터 새롭게 추가된 LocalDate, LocalDateTime, DateTimeFormatter 클래스를 사용합니다. 각각의 클래스는 장단점과 특성이 다르므로, 상황에 맞는 클래스를 선택하여 활용하는 것이 중요합니다. 이번 강의에서는 자바에서 날짜와 시간을 관리하는 대표적인 방법들을 예제 중심으로 자세히 살펴보겠습니다.


📌 목차

  1. Date와 Calendar (레거시 방식)
  2. LocalDate, LocalDateTime (자바 8 이상 방식)
  3. DateTimeFormatter를 이용한 날짜 및 시간 포맷팅
  4. 추가: 시간대(TimeZone) 다루기와 시간 연산
  5. 실전 예제: 날짜 계산과 비교, 특정 포맷으로 변환하기

🔹 1. Date와 Calendar 사용 (레거시 방식)

Date 클래스는 자바 초기부터 날짜와 시간을 표현하기 위해 사용되었지만, 많은 단점 때문에 Calendar 클래스로 점차 대체되었습니다. Date는 날짜와 시간을 밀리초 단위로 관리하며, 직접 날짜를 분해하기 어렵고 불변성이 없어서 다루기 까다로운 편입니다.

import java.util.Date;
import java.util.Calendar;

public class LegacyDateExample {
    public static void main(String[] args) {
        // 현재 시각을 Date 객체로 생성
        Date now = new Date();
        System.out.println("현재 시간 (Date): " + now);

        // Calendar 인스턴스 생성 (현재 시간 기준)
        Calendar cal = Calendar.getInstance();

        // 년, 월, 일 추출 (월은 0부터 시작하므로 +1 해줌)
        System.out.println("년도: " + cal.get(Calendar.YEAR));
        System.out.println("월: " + (cal.get(Calendar.MONTH) + 1));
        System.out.println("일: " + cal.get(Calendar.DAY_OF_MONTH));
    }
}

위 예제에서 볼 수 있듯, Calendar는 날짜를 구성하는 여러 필드를 상수로 제공하며, 각각 쉽게 접근할 수 있도록 합니다. 하지만 월이 0부터 시작하는 점과 같은 특이점 때문에 실수하기 쉽습니다.


🔹 2. LocalDate, LocalDateTime (자바 8 이상 방식)

자바 8에서 도입된 java.time 패키지는 날짜와 시간 API를 대폭 개선하였습니다. 대표적인 클래스가 LocalDateLocalDateTime으로, 각각 날짜만 또는 날짜와 시간을 함께 표현하는 데 최적화되어 있습니다.

import java.time.LocalDate;
import java.time.LocalDateTime;

public class NewDateExample {
    public static void main(String[] args) {
        // 현재 날짜만 구하기
        LocalDate date = LocalDate.now();

        // 현재 날짜와 시간 모두 구하기
        LocalDateTime dateTime = LocalDateTime.now();

        System.out.println("오늘 날짜: " + date);
        System.out.println("현재 날짜 및 시간: " + dateTime);
    }
}

LocalDate와 LocalDateTime은 모두 불변(immutable) 객체로 설계되어 있어, 여러 스레드에서 안전하게 사용할 수 있습니다. 또한, 날짜 연산, 비교가 매우 편리하고 가독성이 뛰어납니다.


🔹 3. DateTimeFormatter를 이용한 날짜 포맷팅

DateTimeFormatter 클래스를 이용하면 날짜와 시간을 원하는 문자열 형식으로 변환할 수 있습니다. 반대로 특정 포맷의 문자열을 날짜/시간 객체로 변환하는 것도 가능합니다. 포맷 패턴 예시는 yyyy-MM-dd HH:mm:ss, dd/MM/yyyy 등이 있습니다.

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class FormatterExample {
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();

        // 포맷터 생성 (연도-월-일 시:분:초)
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        // 날짜를 문자열로 변환
        String formatted = now.format(formatter);

        System.out.println("포맷된 시간: " + formatted);

        // 문자열을 다시 LocalDateTime으로 변환 가능
        LocalDateTime parsedDateTime = LocalDateTime.parse(formatted, formatter);
        System.out.println("파싱된 시간: " + parsedDateTime);
    }
}

위 예제는 현재 시간을 특정 포맷의 문자열로 변환하고, 다시 해당 문자열을 시간 객체로 역변환하는 과정을 보여줍니다. 이를 통해 로그 출력이나 사용자 인터페이스에 알맞은 형태로 날짜를 표현할 수 있습니다.


🔹 4. 시간대(TimeZone) 다루기와 시간 연산

현실 세계에서는 각 지역별 시간대가 다르기 때문에, 시간대를 고려한 처리가 필요합니다. ZoneIdZonedDateTime 클래스를 통해 시간대 정보를 포함한 날짜/시간 처리가 가능합니다.

import java.time.ZonedDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

public class TimeZoneExample {
    public static void main(String[] args) {
        // 현재 시스템 시간대 기준 ZonedDateTime 생성
        ZonedDateTime zdtNow = ZonedDateTime.now();
        System.out.println("현재 시스템 시간대: " + zdtNow);

        // 특정 시간대(뉴욕)로 변환
        ZonedDateTime zdtNY = zdtNow.withZoneSameInstant(ZoneId.of("America/New_York"));
        System.out.println("뉴욕 시간: " + zdtNY.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z")));

        // 시간 더하기 예제 (3시간 후)
        ZonedDateTime plus3Hours = zdtNY.plusHours(3);
        System.out.println("뉴욕 시간 + 3시간: " + plus3Hours.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z")));
    }
}

ZonedDateTime은 시간대 정보를 포함하므로, 서로 다른 시간대 간 시간 비교나 변환을 정확하게 수행할 수 있습니다. 또한, 시간 덧셈, 뺄셈도 메서드 체이닝으로 쉽게 처리됩니다.


🔹 5. 실전 예제: 날짜 계산과 비교, 특정 포맷으로 변환하기

실제 개발 시에는 날짜를 비교하거나 특정 기간을 더하거나 빼는 일이 빈번합니다. 또한 사용자에게 친숙한 날짜 포맷으로 출력해야 합니다. 다음은 다양한 날짜 연산 예제입니다.

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class DateCalculationExample {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        LocalDate futureDate = today.plusDays(10);   // 10일 후 날짜
        LocalDate pastDate = today.minusMonths(2);   // 2개월 전 날짜

        System.out.println("오늘 날짜: " + today);
        System.out.println("10일 후 날짜: " + futureDate);
        System.out.println("2개월 전 날짜: " + pastDate);

        // 날짜 비교
        if (futureDate.isAfter(today)) {
            System.out.println("미래 날짜는 오늘 이후입니다.");
        }

        // 날짜 포맷팅
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMM yyyy");
        System.out.println("오늘 날짜 (포맷팅): " + today.format(formatter));
        System.out.println("10일 후 날짜 (포맷팅): " + futureDate.format(formatter));
    }
}

이 예제는 날짜를 더하고 빼는 방법, 날짜 간의 비교, 그리고 사용자 정의 포맷으로 출력하는 방법을 한 번에 보여줍니다. 이런 기능들은 예약 시스템, 만료일 계산, 이벤트 관리 등 다양한 응용 분야에서 핵심적으로 사용됩니다.


📝 요약

  • Date와 Calendar는 오래된 방식으로, 단순한 날짜 출력이나 호환성을 위해 사용하지만 권장하지 않습니다.
  • LocalDate, LocalDateTime는 불변 객체이며, 날짜 및 시간 처리가 편리하고 안정적입니다.
  • DateTimeFormatter로 날짜와 시간을 다양한 형식으로 출력하고 파싱 할 수 있습니다.
  • ZonedDateTimeZoneId를 이용해 시간대가 포함된 시간 정보를 다룰 수 있습니다.
  • 날짜 덧셈, 뺄셈, 비교 기능을 활용해 실무에서 자주 필요한 날짜 계산을 손쉽게 구현할 수 있습니다.

자바의 날짜/시간 API는 매우 강력하고 유연하므로, 이번 강의를 통해 기본 개념과 사용법을 탄탄히 익히고, 실제 프로젝트에서 자유자재로 활용할 수 있길 바랍니다.

반응형

'Programming' 카테고리의 다른 글

JAVA 쓰레드와 동시성  (62) 2025.11.24
JAVA 클래스 고급  (40) 2025.11.23
JAVA 파일 입출력 (File I/O)  (54) 2025.11.21
JAVA 문자열 처리  (58) 2025.11.20
JAVA 컬렉션 프레임워크  (59) 2025.11.19