Đó là cách khó khăn và các java.util.Date
phương thức setter đó đã bị từ chối kể từ Java 1.1 (1997). Đơn giản chỉ cần định dạng ngày bằng cách sử SimpleDateFormat
dụng mẫu định dạng khớp với chuỗi đầu vào .
Trong trường hợp cụ thể của bạn là "ngày 2 tháng 1 năm 2010" làm chuỗi đầu vào:
- "Tháng một" là tháng toàn văn, vì vậy hãy sử dụng
MMMM
mẫu cho nó
- "2" là ngày ngắn trong tháng, vì vậy hãy sử dụng
d
mẫu cho nó.
- "2010" là năm có 4 chữ số, vì vậy hãy sử dụng
yyyy
mẫu cho nó.
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
Lưu ý tầm quan trọng của các Locale
đối số rõ ràng . Nếu bạn bỏ qua nó, thì nó sẽ sử dụng ngôn ngữ mặc định không nhất thiết phải là tiếng Anh như được sử dụng trong tên tháng của chuỗi đầu vào. Nếu miền địa phương không khớp với chuỗi đầu vào, thì bạn sẽ nhận được một cách khó hiểu java.text.ParseException
ngay cả khi mẫu định dạng có vẻ hợp lệ.
Đây là một trích xuất liên quan từ javadoc , liệt kê tất cả các mẫu định dạng có sẵn:
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
Lưu ý rằng các mẫu có phân biệt chữ hoa chữ thường và các mẫu dựa trên văn bản có bốn ký tự trở lên thể hiện dạng đầy đủ; mặt khác, một hình thức ngắn hoặc viết tắt được sử dụng nếu có sẵn. Vì vậy, ví dụ MMMMM
hoặc nhiều hơn là không cần thiết.
Dưới đây là một số ví dụ về SimpleDateFormat
các mẫu hợp lệ để phân tích một chuỗi đã cho đến ngày:
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
Một lưu ý quan trọng SimpleDateFormat
là không phải là chủ đề an toàn. Nói cách khác, bạn không bao giờ nên khai báo và gán nó dưới dạng biến tĩnh hoặc thể hiện và sau đó sử dụng lại từ các phương thức / luồng khác nhau. Bạn phải luôn tạo nó hoàn toàn mới trong phạm vi cục bộ của phương thức.
Cập nhật Java 8
Nếu bạn tình cờ có trên Java 8 hoặc mới hơn, thì hãy sử dụng DateTimeFormatter
(cũng ở đây, nhấp vào liên kết để xem tất cả các trình định dạng được xác định trước và các mẫu định dạng có sẵn; hướng dẫn có sẵn ở đây ). API mới này được lấy cảm hứng từ 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
Lưu ý: nếu mẫu định dạng của bạn cũng có chứa phần thời gian, thì hãy sử dụng LocalDateTime#parse(text, formatter)
thay vì LocalDate#parse(text, formatter)
. Và, nếu mẫu định dạng của bạn cũng có chứa múi giờ, thì hãy sử dụng ZonedDateTime#parse(text, formatter)
thay thế.
Đây là một trích xuất liên quan từ javadoc , liệt kê tất cả các mẫu định dạng có sẵn:
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;
Xin lưu ý rằng nó có một số trình định dạng được xác định trước cho các mẫu phổ biến hơn. Vì vậy, thay vì ví dụ DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
, bạn có thể sử dụng DateTimeFormatter.RFC_1123_DATE_TIME
. Điều này là có thể bởi vì chúng trái lại SimpleDateFormat
, chủ đề an toàn. Do đó, bạn cũng có thể xác định của riêng bạn, nếu cần thiết.
Đối với định dạng chuỗi đầu vào cụ thể, bạn không cần sử dụng một định nghĩa rõ ràng DateTimeFormatter
: ngày ISO 8601 tiêu chuẩn , như 2016-09-26T17: 44: 57Z, có thể được phân tích cú pháp trực tiếp LocalDateTime#parse(text)
vì nó đã sử dụng trình ISO_LOCAL_DATE_TIME
định dạng. Tương tự, LocalDate#parse(text)
phân tích một ngày ISO mà không có thành phần thời gian (xem ISO_LOCAL_DATE
) và ZonedDateTime#parse(text)
phân tích một ngày ISO với phần bù và múi giờ được thêm vào (xem ISO_ZONED_DATE_TIME
).