그것은 어려운 방법이며, 이러한 java.util.Date
setter 메소드는 Java 1.1 (1997) 이후 더 이상 사용되지 않습니다. 입력 문자열과 일치하는 형식 패턴을 사용 SimpleDateFormat
하여 날짜 형식을 지정하십시오. .
"2010 년 1 월 2 일"의 특정 경우 입력 문자열 :
- "1 월"은 전체 텍스트 달이므로
MMMM
패턴을 사용하십시오.
- "2"는 짧은 기간이므로
d
패턴을 사용하십시오.
- "2010"은 4 자리 연도이므로
yyyy
패턴을 사용하십시오.
String string = "January 2, 2010";
DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
Date date = format.parse(string);
System.out.println(date); // Sat Jan 02 00:00:00 GMT 2010
명백한 Locale
주장 의 중요성에 주목하십시오 . 생략 하면 입력 문자열의 월 이름에 사용되는 영어가 아닌 기본 로케일 이 사용됩니다. 로케일이 입력 문자열과 일치하지 않으면 java.text.ParseException
형식 패턴이 유효 해 보일지라도 혼란스럽게 됩니다.
다음은 사용 가능한 모든 형식 패턴을 나열 하는 javadoc 의 관련성에 대한 추출입니다 .
Letter Date or Time Component Presentation Examples
------ ---------------------- ------------------ -------------------------------------
G Era designator Text AD
y Year Year 1996; 96
Y Week year Year 2009; 09
M/L Month in year Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day in week Text Tuesday; Tue
u Day number of week Number 1
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800
X Time zone ISO 8601 time zone -08; -0800; -08:00
패턴은 대소 문자를 구분하며 4 자 이상의 텍스트 기반 패턴은 전체 형식을 나타냅니다. 그렇지 않으면 가능한 경우 짧거나 축약 된 형식이 사용됩니다. 따라서 예 MMMMM
이상이 불필요합니다.
다음은 SimpleDateFormat
주어진 문자열을 날짜별로 구문 분석하는 유효한 패턴의 예입니다 .
Input string Pattern
------------------------------------ ----------------------------
2001.07.04 AD at 12:08:56 PDT yyyy.MM.dd G 'at' HH:mm:ss z
Wed, Jul 4, '01 EEE, MMM d, ''yy
12:08 PM h:mm a
12 o'clock PM, Pacific Daylight Time hh 'o''clock' a, zzzz
0:08 PM, PDT K:mm a, z
02001.July.04 AD 12:08 PM yyyyy.MMMM.dd GGG hh:mm aaa
Wed, 4 Jul 2001 12:08:56 -0700 EEE, d MMM yyyy HH:mm:ss Z
010704120856-0700 yyMMddHHmmssZ
2001-07-04T12:08:56.235-0700 yyyy-MM-dd'T'HH:mm:ss.SSSZ
2001-07-04T12:08:56.235-07:00 yyyy-MM-dd'T'HH:mm:ss.SSSXXX
2001-W27-3 YYYY-'W'ww-u
중요한 것은 스레드 안전 SimpleDateFormat
이 아니라는 것 입니다. 즉, 정적 또는 인스턴스 변수로 선언하고 할당 한 다음 다른 메소드 / 스레드에서 재사용해서는 안됩니다. 항상 메소드 로컬 범위 내에서 새 것으로 작성해야합니다.
자바 8 업데이트
Java 8 이상을 사용하는 경우 다음을 사용하십시오 DateTimeFormatter
(또한 여기에서 링크를 클릭하여 사전 정의 된 모든 포맷터 및 사용 가능한 형식 패턴을 확인 하십시오 (자습서는 여기에서 사용 가능함 )). 이 새로운 API는 JodaTime에서 영감을 받았습니다 .
String string = "January 2, 2010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(string, formatter);
System.out.println(date); // 2010-01-02
참고 : 형식 패턴에 시간 부분이 포함 된 경우 LocalDateTime#parse(text, formatter)
대신 을 사용하십시오 LocalDate#parse(text, formatter)
. 또한 형식 패턴에 시간대가 포함되어 있으면 ZonedDateTime#parse(text, formatter)
대신 사용하십시오.
다음은 사용 가능한 모든 형식 패턴을 나열 하는 javadoc 의 관련성에 대한 추출입니다 .
Symbol Meaning Presentation Examples
------ -------------------------- ------------ ----------------------------------------------
G era text AD; Anno Domini; A
u year year 2004; 04
y year-of-era year 2004; 04
D day-of-year number 189
M/L month-of-year number/text 7; 07; Jul; July; J
d day-of-month number 10
Q/q quarter-of-year number/text 3; 03; Q3; 3rd quarter
Y week-based-year year 1996; 96
w week-of-week-based-year number 27
W week-of-month number 4
E day-of-week text Tue; Tuesday; T
e/c localized day-of-week number/text 2; 02; Tue; Tuesday; T
F week-of-month number 3
a am-pm-of-day text PM
h clock-hour-of-am-pm (1-12) number 12
K hour-of-am-pm (0-11) number 0
k clock-hour-of-am-pm (1-24) number 0
H hour-of-day (0-23) number 0
m minute-of-hour number 30
s second-of-minute number 55
S fraction-of-second fraction 978
A milli-of-day number 1234
n nano-of-second number 987654321
N nano-of-day number 1234000000
V time-zone ID zone-id America/Los_Angeles; Z; -08:30
z time-zone name zone-name Pacific Standard Time; PST
O localized zone-offset offset-O GMT+8; GMT+08:00; UTC-08:00;
X zone-offset 'Z' for zero offset-X Z; -08; -0830; -08:30; -083015; -08:30:15;
x zone-offset offset-x +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z zone-offset offset-Z +0000; -0800; -08:00;
더 일반적인 패턴을 위해 미리 정의 된 포맷터 가 여러 개 있다는 점에 유의하십시오 . 예를 들어 대신을 DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
사용할 수 있습니다 DateTimeFormatter.RFC_1123_DATE_TIME
. 이는 SimpleDateFormat
스레드 안전 과 달리 가능 합니다. 따라서 필요한 경우 자신을 정의 할 수도 있습니다.
특정 입력 문자열 형식의 경우 명시 적을 사용할 필요가 없습니다 DateTimeFormatter
. 2016-09-26T17 : 44 : 57Z와 같은 표준 ISO 8601 날짜 LocalDateTime#parse(text)
는 이미 ISO_LOCAL_DATE_TIME
포맷터를 사용하므로 직접 구문 분석 할 수 있습니다 . 마찬가지로, LocalDate#parse(text)
시간 구성 요소없이 ISO 날짜를 구문 분석하고 (참조 ISO_LOCAL_DATE
) ZonedDateTime#parse(text)
오프셋과 시간대를 추가하여 ISO 날짜를 구문 분석합니다 (참조 ISO_ZONED_DATE_TIME
).