Java에서 특정 날짜와 시간을 밀리초 단위의 에포크(epoch) 시간으로 변환하는 방법은 여러 가지가 있습니다. 대표적으로 java.text.SimpleDateFormat 클래스, Calendar 클래스, 그리고 Java 8부터 도입된 ZonedDateTime과 Instant 클래스를 활용하는 방식이 있습니다. 각 방법을 예제 코드와 함께 살펴보겠습니다.
1. SimpleDateFormat 클래스 사용하기
java.text.SimpleDateFormat 클래스는 문자열을 날짜로 변환하거나, 날짜를 문자열로 포맷팅하는 데 사용됩니다.
- 이 클래스의 생성자 중 하나는 원하는 날짜 형식을 나타내는 문자열을 인자로 받아 SimpleDateFormat 객체를 생성합니다.
- 문자열을 Date 객체로 변환하려면 원하는 형식 문자열을 전달하여 이 클래스를 인스턴스화합니다.
- parse() 메서드를 사용하여 날짜 문자열을 파싱합니다.
- getTime() 메서드를 호출하면 해당 날짜의 에포크 시간을 밀리초 단위로 얻을 수 있습니다.
예제
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Sample {
public static void main(String args[]) throws ParseException {
// SimpleDateFormat 클래스 인스턴스화
SimpleDateFormat dateformatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
// 주어진 문자열을 Date 객체로 파싱
String str = "25-08-2009 11:20:45";
Date date = dateformatter.parse(str);
long msec = date.getTime();
System.out.println("주어진 날짜의 에포크 시간: " + msec);
}
}
출력 결과
주어진 날짜의 에포크 시간: 1251179445000
2. Calendar 클래스 사용하기
Calendar 객체에는 set() 메서드를 사용하여 날짜와 시간 값을 설정할 수 있습니다. 이 클래스의 getTimeInMillis() 메서드는 설정된 날짜 값의 에포크 시간을 밀리초 단위로 반환합니다.
참고로 Calendar의 월(month) 값은 0부터 시작하므로, 아래 예제에서 9는 10월을 의미합니다.
예제
import java.util.Calendar;
public class Sample {
public static void main(String args[]) {
Calendar cal = Calendar.getInstance();
cal.set(2014, 9, 11, 10, 25, 30);
long msec = cal.getTimeInMillis();
System.out.print(msec);
}
}
출력 결과
1413003330758
3. ZonedDateTime과 Instant 클래스 사용하기 (Java 8 이상)
ZonedDateTime 객체에는 of() 메서드를 사용하여 날짜와 시간 값을 설정할 수 있습니다. 이후 Instant 클래스의 toEpochMilli() 메서드를 호출하면 해당 날짜 값의 에포크 시간을 밀리초 단위로 얻을 수 있습니다. 이 방식은 시간대(Timezone)를 명시적으로 지정할 수 있어 더욱 정확한 처리가 가능합니다.
예제
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Sample {
public static void main(String args[]) {
// ZonedDateTime 객체 생성
ZoneId id = ZoneId.of("Asia/Kolkata");
ZonedDateTime obj = ZonedDateTime.of(2014, 9, 11, 10, 25, 30, 22, id);
Instant instant = obj.toInstant();
long msec = instant.toEpochMilli();
System.out.println("밀리초: " + msec);
}
}
출력 결과
밀리초: 1410411330000
마무리
기존 방식인 SimpleDateFormat이나 Calendar도 여전히 사용 가능하지만, 스레드 안전성과 불변성(Immutability) 측면에서 더 우수한 Java 8의 java.time API(ZonedDateTime, Instant)를 사용하는 것이 권장됩니다. 특히 시간대가 중요한 애플리케이션에서는 ZonedDateTime 방식이 가장 안정적인 선택입니다.