(Java) Java에서 날짜와 시간을 다루는 방법

 


자바에서 날짜와 시간을 다루는 방법은 여러 가지가 있지만, 대표적으로 java.time, java.util.Date, java.util.Calendar 패키지를 사용합니다. 최신 코드에서는 java.time 패키지를 사용하여 날짜와 시간을 다루는 것이 권장됩니다.


1. java.time 패키지 (Java 8 이상 권장)

Java 8부터 도입된 java.time 패키지는 기존 DateCalendar의 단점을 보완하여 더욱 직관적이고 강력한 기능을 제공합니다.

1.1 현재 날짜 및 시간 가져오기

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        // 현재 날짜
        LocalDate date = LocalDate.now();
        System.out.println("현재 날짜: " + date);

        // 현재 시간
        LocalTime time = LocalTime.now();
        System.out.println("현재 시간: " + time);

        // 현재 날짜 및 시간
        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println("현재 날짜 및 시간: " + dateTime);

        // 특정 타임존의 날짜 및 시간
        ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("Asia/Seoul"));
        System.out.println("서울 시간: " + zonedDateTime);
    }
}

1.2 특정 날짜 및 시간 생성

LocalDate date = LocalDate.of(2024, 3, 4);  // 2024년 3월 4일
LocalTime time = LocalTime.of(14, 30, 15);  // 14시 30분 15초
LocalDateTime dateTime = LocalDateTime.of(2024, 3, 4, 14, 30, 15);
System.out.println(dateTime);

1.3 날짜 연산 (더하기, 빼기)

LocalDate today = LocalDate.now();
LocalDate nextWeek = today.plusWeeks(1);
LocalDate previousMonth = today.minusMonths(1);
System.out.println("다음 주: " + nextWeek);
System.out.println("지난 달: " + previousMonth);

1.4 날짜 비교

LocalDate date1 = LocalDate.of(2024, 3, 1);
LocalDate date2 = LocalDate.of(2024, 3, 4);

boolean isAfter = date1.isAfter(date2); // false
boolean isBefore = date1.isBefore(date2); // true
boolean isEqual = date1.isEqual(date2); // false

System.out.println("date1이 date2보다 이후인가? " + isAfter);
System.out.println("date1이 date2보다 이전인가? " + isBefore);
System.out.println("date1과 date2가 같은가? " + isEqual);

1.5 날짜 형식 변경 (Formatting & Parsing)

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

public class Main {
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        
        // 날짜를 문자열로 변환
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String formattedDate = now.format(formatter);
        System.out.println("포맷된 날짜: " + formattedDate);
        
        // 문자열을 날짜로 변환
        LocalDateTime parsedDate = LocalDateTime.parse("2024-03-04 14:30:00", formatter);
        System.out.println("파싱된 날짜: " + parsedDate);
    }
}

2. java.util.Date (Java 8 이전)

과거에는 Date 클래스를 사용하여 날짜 및 시간을 다뤘습니다. 하지만 Date는 가변성이 있고, Calendar 없이 직접 연산이 불가능하며, SimpleDateFormat을 사용해야 하는 등 단점이 많습니다.

2.1 현재 날짜 및 시간 가져오기

import java.util.Date;

public class Main {
    public static void main(String[] args) {
        Date now = new Date();
        System.out.println("현재 날짜 및 시간: " + now);
    }
}

2.2 날짜 포맷 변경 (SimpleDateFormat)

import java.text.SimpleDateFormat;
import java.util.Date;

public class Main {
    public static void main(String[] args) {
        Date now = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String formattedDate = formatter.format(now);
        System.out.println("포맷된 날짜: " + formattedDate);
    }
}

3. java.util.Calendar (Java 8 이전)

CalendarDate의 단점을 보완하기 위해 도입되었지만, 코드가 복잡하고 사용하기 어렵다는 단점이 있습니다.

3.1 현재 날짜 및 시간 가져오기

import java.util.Calendar;

public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH) + 1; // 0부터 시작하므로 +1 필요
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        int minute = calendar.get(Calendar.MINUTE);
        int second = calendar.get(Calendar.SECOND);

        System.out.println("현재 날짜 및 시간: " + year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second);
    }
}

3.2 날짜 연산

calendar.add(Calendar.DAY_OF_MONTH, 7); // 7일 후
calendar.add(Calendar.MONTH, -1); // 1달 전

4. java.sql.Date (JDBC)

데이터베이스와 연동할 때 java.sql.Date를 사용합니다. 이는 java.util.Date를 상속하지만, 날짜(연-월-일)만 포함하고 시간 정보는 무시합니다.

4.1 java.sql.Date 사용 예시

import java.sql.Date;

public class Main {
    public static void main(String[] args) {
        long millis = System.currentTimeMillis();
        Date sqlDate = new Date(millis);
        System.out.println("SQL 날짜: " + sqlDate);
    }
}

결론

  • Java 8 이상에서는 java.time 패키지를 사용하는 것이 가장 권장됩니다.
  • Java 8 이전에서는 java.util.Datejava.util.Calendar를 사용했지만, 복잡성과 가변성 때문에 최신 코드에서는 잘 사용되지 않습니다.
  • JDBC와 연동할 때는 java.sql.Date를 사용합니다.

어떤 걸 사용해야 할까?

새로운 프로젝트java.time 사용 (LocalDate, LocalTime, LocalDateTime, ZonedDateTime)
구형 코드 유지보수java.util.DateCalendar를 이해하고 필요할 때 변환

DB와 연동java.sql.Date 사용


이전최근