HOWTO · Java

Java에서 문자열을 타임 스탬프로 변환

Java에서 문자열을 타임 스탬프로 변환하는 네 가지 방법을 보여줍니다.

이 페이지의 내용

java.sql.Timestamp는 소수 초 정밀도를 갖는 날짜와 시간을 나타내며 JDBC에서 자주 사용됩니다. 입력 형태에 맞는 파서를 선택하세요. SQL 형식의 날짜와 시간에는 Timestamp.valueOf(), 사용자 지정 형식에는 DateTimeFormatter, 날짜만 있는 입력에는 LocalDate를 사용하면 됩니다. 입력에 없는 시간대 정보를 이 변환으로 알아낼 수는 없습니다.

표준 날짜 및 시간 문자열에 Timestamp.valueOf() 사용하기

2024-06-15 14:30:00 같은 문자열은 Timestamp.valueOf(String)으로 SQL 타임스탬프 형식에서 바로 파싱할 수 있습니다. 이 API는 선택적 소수 초를 포함한 JDBC 타임스탬프 이스케이프 형식 값을 받으므로, 여기 보이는 초 단위까지만 있는 형식으로 제한되지 않습니다. 입력의 날짜 순서나 구분 기호가 다르면 다른 파서를 사용하세요.

다음 예제를 실행해 보세요.

import java.sql.Timestamp;

public class StringToTimestamp {
  public static void main(String[] args) {
    String input = "2024-06-15 14:30:00";
    Timestamp timestamp = Timestamp.valueOf(input);
    System.out.println(timestamp);
  }
}
2024-06-15 14:30:00.0

출력된 .0은 소수 초 부분입니다. 형식이 잘못된 값은 API에서 거부됩니다. 외부 입력을 검증하고 애플리케이션 경계에서 파싱 오류를 처리하세요.

DateTimeFormatter로 사용자 지정 날짜 및 시간 문자열 파싱하기

값이 15/06/2024 14:30:00 같은 형식이면 DateTimeFormatter로 LocalDateTime으로 파싱한 다음, 그 객체를 Timestamp.valueOf(LocalDateTime)에 전달하세요. 패턴은 입력과 일치해야 합니다. dd/MM/uuuu는 일, 월, 연도를 뜻하고 HH:mm:ss는 24시간제를 사용합니다. LocalDateTime에는 의도적으로 오프셋이나 시간대가 없으므로, 이 방법은 벽시계의 날짜 및 시간 필드를 보존하지만 하나의 고유한 순간을 지정하지는 않습니다.

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

public class CustomTimestamp {
  public static void main(String[] args) {
    String input = "15/06/2024 14:30:00";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/uuuu HH:mm:ss");
    LocalDateTime localDateTime = LocalDateTime.parse(input, formatter);
    Timestamp timestamp = Timestamp.valueOf(localDateTime);
  }
}

SimpleDateFormat으로 파싱한 날짜를 Timestamp로 변환하기

java.util.Date를 사용하는 레거시 코드에서는 SimpleDateFormat으로 사용자 지정 패턴을 파싱할 수 있습니다. 파싱 결과는 Date이며, getTime()은 Timestamp 생성자가 받는 에포크 기준 밀리초 값을 반환합니다. 시간대를 직접 지정하지 않으면 SimpleDateFormat은 JVM 기본 시간대를 사용하고, 기본적으로 관대한 파싱을 수행합니다. 해석 결과를 예측할 수 있어야 한다면 두 설정을 모두 명시하세요. 예제에서는 UTC를 고정하고 관대한 파싱을 비활성화합니다. 이 API는 상태를 변경할 수 있고 스레드 안전하지 않으므로 하나의 인스턴스를 여러 스레드에서 동시에 공유하지 마세요.

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class LegacyTimestamp {
  public static void main(String[] args) throws ParseException {
    SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
    formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
    formatter.setLenient(false);
    Date parsed = formatter.parse("15/06/2024 14:30:00");
    Timestamp timestamp = new Timestamp(parsed.getTime());
  }
}

LocalDate.atStartOfDay()로 날짜만 있는 문자열을 Timestamp로 변환하기

날짜만 있는 값에는 시간이 지정되어 있지 않습니다. LocalDate로 파싱한 뒤 atStartOfDay()를 사용해 의도한 시간을 자정으로 정하고, 결과로 얻은 LocalDateTime을 Timestamp로 변환하세요. 이렇게 하면 가정을 명시적으로 처리할 수 있으며, 입력에 없던 시간을 보존하는 것은 아닙니다.

import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;

public class DateOnlyTimestamp {
  public static void main(String[] args) {
    LocalDate date = LocalDate.parse("2024-06-15");
    LocalDateTime startOfDay = date.atStartOfDay();
    Timestamp timestamp = Timestamp.valueOf(startOfDay);
  }
}

LocalDateTime과 Timestamp 중에서 선택하기

값이 현지 달력 날짜와 시각이며 애플리케이션에서 아직 시간대를 지정하지 않아야 한다면 LocalDateTime을 사용하세요. JDBC 같은 API에서 java.sql.Timestamp를 요구한다면 Timestamp를 사용하세요. 소수 초를 담을 수 있으며 밀리초 값으로 타임라인상의 한 시점을 나타냅니다. LocalDateTime을 변환할 때는 JVM 기본 시간대를 사용해 그 값을 계산하므로, 기본 시간대가 다른 시스템에서는 날짜 및 시각 필드가 같아도 서로 다른 순간을 가리킬 수 있습니다.

입력에 오프셋이나 지역이 포함되어 있다면, 인스턴트나 데이터베이스 형식으로 변환하기 전에 오프셋 또는 시간대가 있는 java.time 형식으로 파싱해 해당 정보를 유지하세요. Timestamp.valueOf()와 LocalDateTime 어느 쪽도 입력을 보낸 쪽의 의도된 시간대를 추론할 수 없습니다. 데이터베이스 열 형식과 JDBC 드라이버에도 자체 시간대 규칙이 적용될 수 있으므로 애플리케이션의 저장 및 조회 가정을 일관되게 유지하세요.