Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 주어진 날짜와 시간의 밀리초 단위 에포크 시간을 구하는 방법

Java에서 특정 날짜와 시간을 밀리초 단위의 에포크(epoch) 시간으로 변환하는 방법은 여러 가지가 있습니다. 대표적으로 java.text.SimpleDateFormat 클래스, Calendar 클래스, 그리고 Java 8부터 도입된 ZonedDateTimeInstant 클래스를 활용하는 방식이 있습니다. 각 방법을 예제 코드와 함께 살펴보겠습니다.

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 방식이 가장 안정적인 선택입니다.