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

마스터 Java 날짜 형식 지정:SimpleDateFormat 및 DateFormat 설명

소개

SimpleDateFormat java.util.Date의 형식을 지정하고 구문 분석합니다. 사용자 정의 패턴 문자열을 사용하는 값 및 DateFormat 로케일 인식 날짜 및 시간 형식을 위한 추상 기본 API를 제공합니다. 여전히 java.util.Date에 의존하는 레거시 Java 코드를 유지 관리할 때 이 API를 사용하세요.; 새 코드의 경우 DateTimeFormatter을 선호하세요. Java 8+ 날짜/시간 API에서 가져온 이유:SimpleDateFormat 스레드로부터 안전하지 않습니다.

이 튜토리얼에서는 DateFormat를 사용하는 방법을 보여줍니다. 그리고 SimpleDateFormat 서식 지정, 구문 분석, 시간대 변환 및 로캘별 출력을 위한 것입니다. 또한 setLenient(false)을 사용한 엄격한 유효성 검사도 다루고 있습니다. , 스레드 안전 해결 방법 및 DateTimeFormatter으로의 실제 마이그레이션 경로 .

주요 시사점

  • DateFormat 추상 서식 지정 API이며 SimpleDateFormat 패턴 기반 서식 지정 및 구문 분석을 위한 구체적인 구현입니다.
  • SimpleDateFormat 연도, 월, 일, 시간 필드 및 시간대 출력에 대한 풍부한 패턴 토큰을 지원합니다.
  • 공유 SimpleDateFormat 내부 상태가 변경 가능하기 때문에 인스턴스는 다중 스레드 코드에서 안전하지 않습니다.
  • ThreadLocal<SimpleDateFormat> 레거시 코드를 즉시 마이그레이션할 수 없는 경우 스레드별로 포맷터 인스턴스를 격리합니다.
  • DateTimeFormatter 불변이고 스레드로부터 안전하므로 새로운 Java 코드를 대체하는 것이 좋습니다.
  • .parse() ParseException를 던질 수 있습니다 , 따라서 구문 분석 코드는 try-catch 및 유용한 오류 메시지를 사용해야 합니다.
  • setLenient(false) 2024-13-45와 같이 자동으로 조정된 잘못된 날짜를 방지합니다.
  • 항상 명시적인 Locale을 전달하세요. 서버 배포 시 환경에 따른 출력을 방지하기 위해

Java의 SimpleDateFormat은 무엇인가요?

SimpleDateFormat DateFormat입니다 Java에서 형식 지정 및 구문 분석을 위한 명시적인 날짜/시간 패턴을 정의할 수 있는 하위 클래스입니다.

DateFormat를 사용하세요 스타일 기반, 팩토리 메소드를 통한 로케일 인식 출력을 원하는 경우 SimpleDateFormat를 사용하세요. "dd-MM-yyyy" 등 정확한 패턴 제어가 필요한 경우 또는 "yyyy-MM-dd'T'HH:mm:ssZ" . DateFormat 스타일 상수(SHORT , MEDIUM , LONG , FULL )는 정확한 지역 날짜 순서를 알 필요 없이 로케일에 적합한 출력을 생성합니다. 이는 형식이 사용자의 로케일 규칙을 따라야 하는 사용자 표시 문자열에 유용합니다. SimpleDateFormat 사용 출력 형식이 API 계약, 로그 형식 또는 파일 명명 규칙과 같은 외부 요구 사항에 의해 고정되는 경우. 이러한 경우에는 로케일에 관계없이 정확한 패턴이 필요하기 때문입니다.

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
Locale locale = Locale.US;
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, locale);
String styleBased = dateFormat.format(new Date());
SimpleDateFormat patternBased = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss", locale);
String patternOutput = patternBased.format(new Date());
System.out.println(styleBased);
System.out.println(patternOutput);
Jan 5, 2026
05-01-2026 14:30:22

new Locale(String, String) Java 19부터 더 이상 사용되지 않습니다. Locale.Builder을 사용하세요. 대신.

Locale locale = new Locale.Builder()
 .setLanguage("en")
 .setRegion("US")
 .build();

날짜 대신 시간 형식을 지정하려면 DateFormat.getTimeInstance()을 사용하세요. 동일한 로케일 및 스타일 매개변수를 사용합니다.

Locale locale = Locale.US;
DateFormat timeFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM, locale);
System.out.println(timeFormat.format(new Date()));
Output depends on the current time and timezone, for example:
2:30:45 PM

최신 Java 날짜/시간 API에 대한 더 넓은 개요는 Java 8 Date, LocalDate, LocalDateTime, Instant 및 Java 8 기능 예제를 참조하세요.

SimpleDateFormat 패턴 구문 참조

SimpleDateFormat 패턴 문자는 날짜/시간 구성 요소에 직접 매핑되며 올바른 패턴 선택은 출력 형식과 구문 분석 동작을 모두 제어합니다.

기호 의미 예제 패턴 예제 출력 G 연호G AD y 연도yyyy uuuu MMMMM January ww 3 W 월별 주W 1 D 일년 중 일D 15 d 월별 일dd 05 F 월의 요일F 1 E 요일 이름EEE Mon u 주의 요일 수(1 = Monday )u 1 a AM/PM 마커a PM H 하루 중 시간(0-23 )HH 14 k 하루 중 시간(1-24 )k 14 K 오전/오후 시간(0-11 )K 2 h 오전/오후 시간(1-12 )hh 02 mmm 30 s 초(분)ss 45 S 밀리초SSS 123 z 일반 시간대z IST Z RFC 822 시간대 오프셋Z +0530 X ISO 8601 시간대 오프셋XXX +05:30

패턴 반복 및 출력 폭

반복되는 패턴 문자는 너비, 숫자 패딩 또는 텍스트 스타일을 변경합니다.

필드 패턴 예제 출력 월M 1MM 01MMM JanMMMM January 날짜d 5 날짜dd 05 시간(0-23 )H 7 시간(0-23 )HH 07 연도yy 26 연도yyyy uuuu

예상 출력이 포함된 일반적인 패턴 예

이러한 일반적인 패턴은 로그, API 및 사용자 대상 날짜에 유용합니다.

패턴 예제 출력 MM/dd/yyyy 01/05/2026 dd-M-yyyy hh:mm:ss 05-1-2026 02:30:45 dd MMMM yyyy 05 January 2026 dd MMMM yyyy zzzz 05 January 2026 India Standard Time E, dd MMM yyyy HH:mm:ss z Mon, 05 Jan 2026 14:30:45 IST

SimpleDateFormat을 사용하여 날짜 형식을 지정하는 방법

Date 형식을 지정하려면 , SimpleDateFormat를 생성하세요 패턴을 입력하고 .format(date)에 전화하세요. .

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
Date now = new Date();
SimpleDateFormat basic = new SimpleDateFormat("MM-dd-yyyy", Locale.US);
SimpleDateFormat withTime = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss", Locale.US);
SimpleDateFormat isoLike = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US);
System.out.println(basic.format(now));
System.out.println(withTime.format(now));
System.out.println(isoLike.format(now));
01-05-2026
05-01-2026 14:30:45
2026-01-05T14:30:45+0000

SimpleDateFormat 포맷터 인스턴스의 시간대 및 로케일 규칙을 적용하므로 출력이 일관되어야 하는 경우 해당 값을 명시적으로 설정하세요.

SimpleDateFormat을 사용하여 문자열을 날짜로 구문 분석하는 방법

문자열을 Date로 구문 분석하려면 , 정확한 입력 패턴으로 포맷터를 생성하고 .parse(input)를 호출합니다. .

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
try {
 SimpleDateFormat dateParser = new SimpleDateFormat("dd-MM-yyyy", Locale.US);
 Date parsedDate = dateParser.parse("05-01-2026");
 System.out.println(parsedDate);
 SimpleDateFormat timeParser = new SimpleDateFormat("HH:mm:ss", Locale.US);
 Date parsedTime = timeParser.parse("22:15:09");
 System.out.println(parsedTime);
} catch (ParseException e) {
 e.printStackTrace();
}
Mon Jan 05 00:00:00 UTC 2026
Thu Jan 01 22:15:09 UTC 1970

시간만 제공되면 Java는 epoch 날짜를 날짜 부분으로 사용합니다.

ParseException을 올바르게 처리하기

parse() ParseException 발생 입력이 구성된 패턴과 일치하지 않으면 프로덕션 코드가 이를 포착하고 원시 입력과 예상 패턴을 모두 기록해야 합니다.

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
String input = "31/01/2026";
String pattern = "dd-MM-yyyy";
SimpleDateFormat parser = new SimpleDateFormat(pattern, Locale.US);
try {
 parser.parse(input);
 System.out.println("Parsed successfully");
} catch (ParseException e) {
 // Include both the input value and pattern for easier debugging.
 System.err.println("Failed to parse date string: " + input);
 System.err.println("Expected pattern: " + pattern);
 System.err.println("Parser error: " + e.getMessage());
}
Failed to parse date string: 31/01/2026
Expected pattern: dd-MM-yyyy
Parser error: Unparseable date: "31/01/2026"

서비스 전체에서 재사용할 수 있는 예외 처리 패턴은 Java 및 Java 8 Date, LocalDate, LocalDateTime, Instant의 예외 처리를 참조하세요.

파싱 전 날짜 문자열 검증

SimpleDateFormat 기본적으로 관대하므로 잘못된 값이 실패하는 대신 롤오버될 수 있습니다. setLenient(false)에 전화해 주세요 엄격한 검증을 시행합니다.

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
String invalid = "2024-13-45";
SimpleDateFormat lenientParser = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
SimpleDateFormat strictParser = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
strictParser.setLenient(false);
System.out.println("Lenient parse result:");
try {
 // Lenient mode silently rolls over invalid values instead of throwing.
 System.out.println(lenientParser.parse(invalid));
} catch (ParseException e) {
 System.out.println("ParseException: " + e.getMessage());
}
System.out.println("Strict parse result:");
try {
 System.out.println(strictParser.parse(invalid));
} catch (ParseException e) {
 System.out.println("ParseException: " + e.getMessage());
}
Lenient parse result:
Fri Feb 14 00:00:00 UTC 2025
Strict parse result:
ParseException: Unparseable date: "2024-13-45"

SimpleDateFormat의 시간대 처리

SimpleDateFormat 동일한 Date을 렌더링할 수 있습니다. 출력하기 전에 포맷터에 시간대를 설정하여 다른 시간대에서. Date 객체는 UTC 밀리초 수만 저장하며 자체 시간대는 포함하지 않습니다. 시간대는 저장 문제가 아니라 형식 문제입니다. 같은 Date 값은 포맷터가 적용되는 시간대에 따라 사람이 읽을 수 있는 출력이 달라집니다. 이는 setTimeZone()를 의미합니다. format() 이전에 포맷터에서 호출되어야 합니다. 라고; 나중에 설정해도 이미 생성된 출력에는 영향을 주지 않습니다.

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
Date timestamp = new Date(1700000000000L); // Fixed instant for repeatable output
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z", Locale.US);
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println("UTC: " + formatter.format(timestamp));
formatter.setTimeZone(TimeZone.getTimeZone("America/New_York"));
System.out.println("New York: " + formatter.format(timestamp));
formatter.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
System.out.println("Kolkata: " + formatter.format(timestamp));
UTC: 2023-11-14 22:13:20 +0000
New York: 2023-11-14 17:13:20 -0500
Kolkata: 2023-11-15 03:43:20 +0530

더 자세한 시간대 변환 패턴을 보려면 Java 날짜를 특정 시간대 형식으로 변환하는 방법을 참조하세요.

일반적인 시간대 실수와 이를 방지하는 방법

시간대 버그는 저장된 순간과 렌더링된 현지 시간을 혼동하여 발생하는 경우가 많습니다.

  • Date UTC 밀리초를 저장하며, 서식을 지정할 때만 시간대가 적용됩니다.
  • setTimeZone()에 전화 걸기 다중 스레드 환경의 공유 포맷터 인스턴스에서 다른 스레드의 내부 호출에 대한 작업 중에 시간대를 변경하여 예외가 발생하지 않고 잘못된 시간대로 출력을 생성할 수 있습니다.
  • 단일 SimpleDateFormat 재사용 aservlet 또는 Spring 컨트롤러의 HTTP 요청 전반에 걸쳐 인스턴스가 발생하면 요청 하나의 setTimeZone()가 발생할 수 있습니다. 다른 요청의 출력에 영향을 주기 위해 호출합니다. 요청별로 새 인스턴스를 생성하거나 ThreadLocal<SimpleDateFormat>를 사용하세요. 상태를 분리하다
  • TimeZone.getTimeZone("Invalid/Zone") 메서드 계약이 예외를 발생시키는 대신 인식할 수 없는 ID에 대한 기본값으로 GMT를 지정하기 때문에 자동으로 GMT로 대체됩니다.
  • ZoneId.of()로 영역 ID 확인 java.time에서 TimeZone.getTimeZone()에 전달하기 전에; ZoneId.of() ZoneRulesException 발생 잘못된 ID로 인해 문제가 명백해졌습니다.

로캘 인식 날짜 형식

프랑스어 월 이름이나 독일 요일 이름과 같은 로캘별 날짜 출력을 생성하려면 Locale를 전달하세요. SimpleDateFormat으로 생성자. 내장 상수 Locale.US를 사용하세요. , Locale.UK , Locale.FRENCH , Locale.GERMAN , 일반 지역의 경우 Locale.Builder을 사용하여 사용자 정의 로캘을 구성합니다. 상수가 적용되지 않는 영역이 필요할 때. Locale 월 이름, 요일 이름 및 오전/오후 표시와 같은 텍스트 필드에 사용되는 언어를 제어합니다.

SimpleDateFormat 생성자에서 로케일 지정

Locale을 전달하세요. 두 번째 생성자 인수로. 생략하면 SimpleDateFormat Locale.getDefault()에 전화하세요. 내부적으로 포맷터를 JVM의 런타임 로케일에 바인딩합니다. 이 값은 개발자 시스템, CI 환경, 다양한 OS 로케일 구성에서 실행되는 프로덕션 서버 간에 다릅니다.

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
Date sample = new Date(1700000000000L);
String pattern = "EEEE, dd MMMM yyyy";
SimpleDateFormat usFormatter = new SimpleDateFormat(pattern, Locale.US);
SimpleDateFormat frFormatter = new SimpleDateFormat(pattern, Locale.FRENCH);
String usDate = usFormatter.format(sample);
String frDate = frFormatter.format(sample);
System.out.println("US: " + usDate);
System.out.println("French: " + frDate);
US: Tuesday, 14 November 2023
French: mardi, 14 novembre 2023

지역별 월 및 일 이름 형식 지정

동일한 패턴이 로케일에 따라 다른 텍스트 출력을 생성합니다.

로케일 패턴 출력 Locale.US EEEE, dd MMMM yyyy Tuesday, 14 November 2023 Locale.FRENCH EEEE, dd MMMM yyyy mardi, 14 novembre 2023 Locale.GERMAN EEEE, dd MMMM yyyy Dienstag, 14 November 2023

Locale.getDefault()에 의존 서버 환경에서 실행되는 JVM에서는 OS 로케일 설정이 호스트마다 다르기 때문에 일관성 없는 출력이 생성될 수 있습니다. 항상 명시적인 Locale를 전달하세요. .

SimpleDateFormat의 스레드 안전 문제

SimpleDateFormat이 스레드로부터 안전하지 않은 이유

SimpleDateFormat 내부 Calendar를 변경합니다. 그리고 NumberFormat 구문 분석/포맷 작업 중 상태. 여러 스레드가 하나의 인스턴스를 사용하는 경우 작업 중에 이러한 변경 가능한 필드를 덮어쓰게 되어 경쟁 조건과 예측할 수 없는 출력이 발생할 수 있습니다. 실제로 이는 한 스레드의 날짜가 다른 스레드의 결과인 .parse()에 나타나는 것으로 나타납니다. 예외 없이 완전히 잘못된 날짜를 반환하거나 ArrayIndexOutOfBoundsException 포맷터 자체 내부에서 발생합니다. 이러한 오류는 간헐적이고 로드에 따라 달라지므로 단일 스레드 테스트 환경에서 재현하기 어렵습니다.

레거시 코드에서 동시성이 안전한 형식이 필요한 경우 스레드 또는 요청 범위별로 인스턴스를 격리하세요. Java 스레딩 동작에 대한 배경 지식은 Java 스레드 예를 참조하세요.

ThreadLocal을 사용하여 SimpleDateFormat 인스턴스 분리

ThreadLocal<SimpleDateFormat> 각 스레드에 자체 포맷터 인스턴스를 제공하고 공유 변경 가능 상태를 방지합니다. 서블릿 컨테이너 및 Spring 애플리케이션과 같은 스레드 풀 환경에서 스레드는 요청 전반에 걸쳐 재사용되며 절대 종료되지 않습니다. 이는 ThreadLocal를 의미합니다. 값은 자동으로 제거되지 않습니다. 항상 FORMATTER.remove()에 전화하세요. 그렇지 않으면 포맷터 인스턴스가 스레드 수명 동안 유지되고 지속적인 로드 시 메모리 누수로 누적됩니다.

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class ThreadSafeLegacyFormatter {
 // Each thread gets one dedicated formatter instance.
 private static final ThreadLocal<SimpleDateFormat> FORMATTER =
 ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US));
 public static String format(Date date) {
 try {
 // No cross-thread mutation because each thread reads its own formatter.
 return FORMATTER.get().format(date);
 } finally {
 // Remove the instance after use to prevent memory leaks in thread pools.
 FORMATTER.remove();
 }
 }
}

스레드로부터 안전한 대안으로 DateTimeFormatter로 전환

DateTimeFormatter 불변이고 스레드로부터 안전하므로 하나의 공유 정적 인스턴스가 안전합니다.

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Locale;
// Not thread-safe when shared across threads
SimpleDateFormat unsafe = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
System.out.println(unsafe.format(new Date()));
// Thread-safe: DateTimeFormatter is immutable and can be stored as a static field
DateTimeFormatter safe = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.US);
System.out.println(safe.format(LocalDateTime.now()));
2026-01-05 14:30:22
2026-01-05 14:30:22

SimpleDateFormat에서 DateTimeFormatter로 마이그레이션

DateTimeFormatter로 마이그레이션 스레드 안전 위험을 제거하고 ThreadLocal을 제거합니다. 해결 방법을 제공하고 java.time과 깔끔하게 통합됩니다. 유형. 대부분의 코드베이스에서 마이그레이션은 기계적입니다. 패턴 구문이 거의 동일하고, 증분 롤아웃 중에 두 API가 공존할 수 있으며, 모든 것을 한 번에 변환할 필요가 없습니다. 주요 위험은 u입니다. SimpleDateFormat의 요일을 의미하는 기호 및 연도 DateTimeFormatter; 이를 확인하지 않고 API 간에 직접 패턴을 복사하면 자동으로 잘못된 출력이 생성됩니다.

나란한 코드 비교

이 병렬 스니펫은 레거시 API와 최신 API에서 동등한 형식 지정 및 구문 분석 동작을 보여줍니다.

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Locale;
String pattern = "yyyy-MM-dd";
String input = "2026-01-05";
// SimpleDateFormat (legacy java.util.Date API)
SimpleDateFormat legacyFormatter = new SimpleDateFormat(pattern, Locale.US);
Date legacyParsed = legacyFormatter.parse(input);
String legacyFormatted = legacyFormatter.format(new Date());
// DateTimeFormatter (modern java.time API)
DateTimeFormatter modernFormatter = DateTimeFormatter.ofPattern(pattern, Locale.US);
LocalDate modernParsed = LocalDate.parse(input, modernFormatter);
String modernFormatted = modernFormatter.format(LocalDate.now());
System.out.println(legacyParsed);
System.out.println(legacyFormatted);
System.out.println(modernParsed);
System.out.println(modernFormatted);
Mon Jan 05 00:00:00 UTC 2026
2026-01-05
2026-01-05
2026-01-05

두 API 간의 패턴 구문 차이점

대부분의 패턴 문자는 유사하지만 일부 기호는 다르므로 직접 복사하면 마이그레이션이 중단될 수 있습니다.

작업 SimpleDate형식 패턴 DateTimeFormatter 패턴 참고 연도yyyy uuuu 또는 yyyy uuuu 선호 java.time에 증가하는 해의 일관성을 위해 시간대 오프셋/이름z , Z , X z , Z , x , X java.time 더 많은 오프셋 변형을 구별합니다(xX )리터럴 텍스트'T' 'T' 두 API 모두 리터럴u에 작은따옴표를 사용합니다. 기호요일 번호YearKnown 확인:u API 간 의미 변경

단계별 마이그레이션 체크리스트

기존 코드베이스에서 한 번에 하나의 포맷터를 변환하려면 이 체크리스트를 사용하세요.

  1. import java.text.SimpleDateFormat; 교체 import java.time.format.DateTimeFormatter; 사용
  2. new SimpleDateFormat("yyyy-MM-dd") 바꾸기 DateTimeFormatter.ofPattern("yyyy-MM-dd") 사용
  3. .parse() 바꾸기 LocalDate.parse() 사용 또는 LocalDateTime.parse() 입력 정밀도에 따라
  4. .format(date) 바꾸기 formatter.format(localDate) 사용 또는 formatter.format(localDateTime)
  5. new Date() 제거 가능하다면 LocalDate.now()를 사용하세요. 또는 Instant.now()

DateTimeFormatter java.time에서만 작동합니다. 유형(LocalDate , LocalDateTime , ZonedDateTime , Instant ). java.util.Date을 허용하지 않습니다. 직접. 여전히 java.util.Date를 생성하는 코드가 있는 경우 예를 들어 레거시 ORM 또는 JDBC 드라이버의 값은 date.toInstant()를 사용하여 먼저 변환합니다. DateTimeFormatter로 전달하기 전에 . 증분 마이그레이션 중에 두 API가 동일한 코드베이스에 공존할 수 있습니다. 모든 것을 한 번에 변환할 필요는 없습니다. DateTimeFormatter ParseException도 대체합니다. java.time.format.DateTimeParseException 사용 이는 확인되지 않은 예외이므로 try-catch 블록은 선택 사항이 되지만 프로덕션 구문 분석 코드에서는 여전히 권장됩니다.

마이그레이션 컨텍스트 및 유형 선택에 대해서는 Java 8 Date, LocalDate, LocalDateTime, Instant를 참조하세요.

자주 묻는 질문

Java에서 SimpleDateFormat과 DateFormat의 차이점은 무엇입니까?

DateFormat 날짜/시간 형식에 대한 계약을 정의하는 추상 클래스입니다. SimpleDateFormat 사용자 정의 패턴 기반 형식을 허용하는 구체적인 하위 클래스입니다. SimpleDateFormat을 사용합니다. 코드에서 직접; DateFormat를 사용하세요 구현을 허용하려는 경우 참조 유형으로 사용됩니다.

SimpleDateFormat은 스레드로부터 안전합니까?

번호 SimpleDateFormat 인스턴스는 스레드로부터 안전하지 않습니다. 동기화 없이 스레드 간에 단일 인스턴스를 공유하면 예측할 수 없는 구문 분석 및 형식 지정 결과가 발생합니다. ThreadLocal<SimpleDateFormat> 사용 또는 java.time.format.DateTimeFormatter으로 바꾸세요. , 이는 불변이며 스레드로부터 안전합니다.

SimpleDateFormat을 사용하여 dd-MM-yyyy 형식의 날짜 문자열을 어떻게 구문 분석하나요?

SimpleDateFormat 인스턴스화 "dd-MM-yyyy" 패턴 사용 , 그런 다음 .parse(yourString)로 전화하세요. . ParseException에 대한 try-catch 블록으로 호출을 래핑합니다. . 입력 문자열이 구분 문자를 포함하여 패턴과 정확히 일치하는지 확인하세요.

SimpleDateFormat을 사용하여 날짜를 다른 시간대로 변환하려면 어떻게 해야 하나요?

.setTimeZone(TimeZone.getTimeZone("America/New_York"))에 전화하세요 SimpleDateFormat에서 .format(date)를 호출하기 전 인스턴스 . 기본 Date 객체는 UTC 밀리초를 보유합니다. 포맷터는 출력 중에 시간대 오프셋을 적용합니다.

'yyyy-MM-dd'T'HH:mm:ssZ' 패턴은 무엇을 생성하나요?

ISO 8601 호환 타임스탬프(예:2024-06-15T14:30:00+0530)를 생성합니다. . T 작은따옴표로 묶인 리터럴 문자입니다. Z RFC 822 시간대 오프셋을 나타냅니다.

SimpleDateFormat에서 DateTimeFormatter로 어떻게 마이그레이션하나요?

new SimpleDateFormat("yyyy-MM-dd") 바꾸기 DateTimeFormatter.ofPattern("yyyy-MM-dd") 사용 . .parse() 바꾸기 LocalDate.parse()으로 전화 또는 LocalDateTime.parse() . .format(date) 바꾸기 formatter.format(localDate)로 전화 . DateTimeFormatter에 유의하세요. u를 사용합니다. 일부 상황에서는 y 대신 연도 동안 .

SimpleDateFormat이 예외를 발생시키지 않고 잘못된 날짜를 구문 분석하는 이유는 무엇입니까?

기본적으로 SimpleDateFormat 범위를 벗어난 값을 거부하는 대신 조정하는 관대한 구문 분석 모드를 사용합니다. .setLenient(false)에 전화하세요. 엄격한 유효성 검사를 시행하고 ParseException을 발생시키기 위해 구문 분석하기 전에 잘못된 입력 시.

SimpleDateFormat을 사용하여 특정 로캘로 날짜 형식을 지정하려면 어떻게 해야 하나요?

Locale를 통과하세요 생성자에 대한 두 번째 인수:new SimpleDateFormat("dd MMMM yyyy", Locale.FRENCH) . 이는 지정된 언어로 월 및 일 이름을 렌더링하며, 이는 여러 지역에 서비스를 제공하는 애플리케이션에 매우 중요합니다.

결론

이 가이드에서는 DateFormat를 다루었습니다. 및 SimpleDateFormat 기본 사항, 패턴 구문, 형식 지정 및 구문 분석 작업 흐름, 시간대 동작, 로케일 인식 렌더링, 스레드 안전 문제 및 DateTimeFormatter로 마이그레이션 .

이제 레거시 및 최신 코드에 적합한 포맷터를 선택하고, 엄격한 검증을 통해 입력을 방어적으로 구문 분석하고, 서버 환경에서 로케일 및 시간대 드리프트를 방지하고, 공유 날짜 포맷터에서 동시성 위험을 제거할 수 있습니다.

다음 단계에서는 Java 8 날짜, LocalDate, LocalDateTime, Instant, 예제가 포함된 Java 8 기능, Java의 예외 처리 및 Java 날짜를 특정 시간대 형식으로 변환하는 방법을 검토하여 Java 애플리케이션의 날짜/시간 처리를 계속 현대화합니다.

참조:

  • SimpleDateFormat API 문서
  • DateFormat API 문서
  • DateTimeFormatter API 문서

마스터 Java 날짜 형식 지정:SimpleDateFormat 및 DateFormat 설명 이 저작물은 Creative Commons Attribution-NonCommercial- ShareAlike 4.0 International에 따라 라이센스가 부여됩니다. 라이센스.